Невозможно применить команду 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 потерпеть неудачу по этой причине:

  1. search $1 $2 $3 должно быть search "$1" "$2" "$3";
  2. for elem in $1/* должно быть for elem in "$1"/*;
  3. owner=`stat --format "%s" $1` должно быть owner=`stat --format "%s" "$1"`;
  4. size=`stat --format "%U" $1` должно быть size=`stat --format "%U" "$1"`;
  5. 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

Кроме того, другие ошибки:

  1. owner=`stat --format "%s" "$1"` должно быть owner=`stat --format "%U" "$1"` а также size=`stat --format "%U" "$1"` должно быть size=`stat --format "%s" "$1"`;
  2. Вы не можете использовать > сделать численное сравнение. использование -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"
Другие вопросы по тегам