Невозможно применить команду stat для данных параметров
Я хочу сделать небольшой сценарий оболочки, который показывает все файлы в дереве файлов, начиная с заданного каталога, у которого заданный пользователь и размер больше заданного размера. Следовательно, мой скрипт будет принимать в качестве параметров каталог, с которого нужно начать, имя пользователя и размер. Это то, что я до сих пор:
#!/bin/bash
owner="valdsilviufarcas"
size=0
function display_owner_and_size()
{
owner=`stat --format "%s" $1`
size=`stat --format "%U" $1`
}
function search()
{
for elem in $1/*
do
display_owner_and_size "$elem"
if [[ $owner == $2 && $size > $3 ]]
then
echo $elem
fi
if test -d "$elem"
then
search "$elem" $2 $3
fi
done
}
search $1 $2 $3
Тем не менее, я продолжаю получать эту ошибку: Cannot stat: (bla-bla-bla) : No such file or directory
, Почему функция stat не работает?
2 ответа
Вы должны просто использовать find
команда:
find ${dir} -user ${user} -type f -size +${size}c -printf "%u\t%s\t%h/%f\n"
Заменить переменные Bash ${dir}
с каталогом для рекурсивного изучения, ${user}
с именем пользователя или UID, который должен отображаться только и ${size}
с минимальным размером файла в байтах (не включительно! если вы используете значение 100
самый маленький отображаемый файл может иметь 101 байт).
Эта команда будет печатать только обычные файлы, она игнорирует каталоги и специальные файлы, такие как символические ссылки или устройства в выводе.
Есть две разные проблемы.
Во-первых, вы не цитируете свои переменные: это в конечном итоге делает stat
потерпеть неудачу по этой причине:
search $1 $2 $3
должно бытьsearch "$1" "$2" "$3"
;for elem in $1/*
должно бытьfor elem in "$1"/*
;owner=`stat --format "%s" $1`
должно бытьowner=`stat --format "%s" "$1"`
;size=`stat --format "%U" $1`
должно бытьsize=`stat --format "%U" "$1"`
;search "$elem" $2 $3
должно бытьsearch "$elem" "$2" "$3"
,
Во-вторых, когда во время рекурсии достигается пустой каталог, расширение for element in $1/*
терпит неудачу и два stat
команды вызываются /path/to/empty/directory/*
, которого не существует:
% bash script.sh /home/user user 0
stat: cannot stat ‘/home/user/Documenti/Musica/*’: No such file or directory
stat: cannot stat ‘/home/user/Documenti/Musica/*’: No such file or directory
stat: cannot stat ‘/home/user/Documenti/My Games/*’: No such file or directory
stat: cannot stat ‘/home/user/Documenti/My Games/*’: No such file or directory
stat: cannot stat ‘/home/user/Documenti/Video/*’: No such file or directory
stat: cannot stat ‘/home/user/Documenti/Video/*’: No such file or directory
stat: cannot stat ‘/home/user/home/user/*’: No such file or directory
stat: cannot stat ‘/home/user/home/user/*’: No such file or directory
stat: cannot stat ‘/home/user/Modelli/*’: No such file or directory
stat: cannot stat ‘/home/user/Modelli/*’: No such file or directory
stat: cannot stat ‘/home/user/Musica/*’: No such file or directory
stat: cannot stat ‘/home/user/Musica/*’: No such file or directory
stat: cannot stat ‘/home/user/Pubblici/*’: No such file or directory
stat: cannot stat ‘/home/user/Pubblici/*’: No such file or directory
stat: cannot stat ‘/home/user/Video/*’: No such file or directory
stat: cannot stat ‘/home/user/Video/*’: No such file or directory
%
Один из способов исправить это - проверить, существует ли файл / каталог перед вызовом. display_owner_and_size
, чтобы пропустить текущую итерацию, если мы пытаемся выполнить stat / travers для каталога, который не существует (так как каталог пуст, нет причин для stat
его содержание, ни продолжать проходить эту ветку дерева):
[ -e "$elem" ] && display_owner_and_size "$elem" || continue
Кроме того, другие ошибки:
owner=`stat --format "%s" "$1"`
должно бытьowner=`stat --format "%U" "$1"`
а такжеsize=`stat --format "%U" "$1"`
должно бытьsize=`stat --format "%s" "$1"`
;- Вы не можете использовать
>
сделать численное сравнение. использование-gt
:if [[ $owner == $2 && $size -gt $3 ]]
,
Таким образом, исправленный скрипт будет:
#!/bin/bash
owner="valdsilviufarcas"
size=0
function display_owner_and_size()
{
owner=`stat --format "%U" "$1"`
size=`stat --format "%s" "$1"`
}
function search()
{
for elem in "$1"/*
do
[ -e "$elem" ] && display_owner_and_size "$elem" || continue
if [[ $owner == $2 && $size -gt $3 ]]
then
echo $elem
fi
if test -d "$elem"
then
search "$elem" "$2" "$3"
fi
done
}
search "$1" "$2" "$3"