Ошибка «/usr/bin/stat: Слишком длинный список аргументов»

Ошибка «/usr/bin/stat: Слишком длинный список аргументов»

Мне нужно получить список файлов(ов .log/.lst), присутствующих в каталоге(ах $logfolder), дата создания которых указана в определенном $yearи$month

stat  --format='%y %n'  $logfolder/* |
  grep "$year-$month-"|
  awk -F' ' '{print $4}'|
  grep 'log$\|lst$' > $archivepath/filesToArchive

Это не работает, когда я запрашиваю команду для папки, где слишком много файлов. Я получаю следующую ошибку:

-bash: /usr/bin/stat: Argument list too long

решение1

Для забавной возможности, если ваши findручки -newerXY, используйте это! Например, чтобы получить файлы за 1977 год и месяц октябрь:

find "$logfolder" \( -name '*.log' -o -name '*.lst' \) -newermt "1977-10-01" \! -newermt "1977-10-01 +1 month"

Сделанный!

Поскольку у вас уже есть переменные year, то monthэто легко записать так:

find "$logfolder" \( -name '*.log' -o -name '*.lst' \) -newermt "$year-$month-01" \! -newermt "$year-$month-01 +1 month"

Всего одна findкоманда! Удивительно!

решение2

Я бы сделал это так:

find "$logfolder" \( -name '*.log' -o -name '*lst' \) -printf "%TB\t%TY\t%p\n" |
     awk '$1==m && $2==y' m="$month" y="$year" | cut -f 3- 

Объяснение

Объединив два -nameвызова в скобки, вы можете объединить их с помощью -oфлага (или). Это заставит findискать файлы .logили . (Расширение GNU) выводит месяц модификации файла ( ), затем год его модификации ( ), а затем его путь ( ), с табуляцией ( ) между каждым полем..lst-printf%TB%TY%p\t

Просто awkпроверяется, что первое поле (месяц) совпадает с $month, а второе — с $year.

Удаляет cutпервые два поля (месяц и год) и печатает все, начиная с третьего поля.

Я проверил вышеизложенное, создав файлы, измененные в декабре 2012 года (и установленные $monthна «Декабрь» и $yearна 2012):

$ touch -d "December 13 2012" {a,b,c}{.lst,.log}
$ touch c.lst a.log ## c.lst and a.log now have today's modification date.
$ find $logfolder \( -name '*.log' -o -name '*lst' \) -printf "%TB\t%TY\t%p\n" |
  awk '$1==m && $2==y' m="$month" y="$year" | cut -f 3-
./b.log
./c.log
./b.lst
./a.lst

(обратите внимание, что предполагается, что имена файлов и каталогов не содержат символов новой строки).

решение3

Попробуй это:

find $logfolder -type f -exec stat --format='%y %n' "{}" + |
  grep "$year-$month-"|
  awk -F' ' '{print $4}'|
  grep 'log$\|lst$' > $archivepath/filesToArchive

решение4

ls -lh *.log *.lst logfolder | grep year | grep month

Связанный контент