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

0
задан 3 March 2016 в 12:12

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 байт).

Эта команда только распечатает регулярные файлы, она игнорирует каталоги и специальные файлы как символьные ссылки или устройства в выводе.

0
ответ дан 3 March 2016 в 22:12
  • 1
    Я can' t добавляют что строка к каждому .save файлу в папке,/etc/apt/sources.list.d/, потому что they' ll быть повторно созданным. – emreaydin149 4 June 2017 в 13:52

Существует два других вопроса.

Первый, Вы не заключаете свои переменные в кавычки: это в конечном счете делает 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 его содержание, ни продолжать пересекать то ответвление дерева):

[ -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"
0
ответ дан 3 March 2016 в 22:12
  • 1
    Хм I' d предлагают заключить разделитель в кавычки (оставляющий их, мог привести к отъезду их, когда они необходимы), – ADDB 1 June 2017 в 04:11

Другие вопросы по тегам:

Похожие вопросы: