
Мне нужно получить список файлов(ов .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