
Preciso pegar a lista de arquivos( .log/.lst
) presentes em um diretório( $logfolder
) cuja data de criação está em um local específico $year
e$month
stat --format='%y %n' $logfolder/* |
grep "$year-$month-"|
awk -F' ' '{print $4}'|
grep 'log$\|lst$' > $archivepath/filesToArchive
Isso não funciona quando eu consulto o comando para uma pasta onde há muitos arquivos. Estou tendo o erro a seguir:
-bash: /usr/bin/stat: Argument list too long
Responder1
Para uma possibilidade engraçada, se você find
tiver alças -newerXY
, use-a! Por exemplo, para obter os arquivos do ano de 1977 e do mês de outubro:
find "$logfolder" \( -name '*.log' -o -name '*.lst' \) -newermt "1977-10-01" \! -newermt "1977-10-01 +1 month"
Feito!
Como você já tem as variáveis year
e month
é simples escrever como:
find "$logfolder" \( -name '*.log' -o -name '*.lst' \) -newermt "$year-$month-01" \! -newermt "$year-$month-01 +1 month"
Apenas um find
comando! incrível!
Responder2
Eu faria assim:
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-
Explicação
Ao agrupar as duas -name
chamadas entre parênteses, você pode combiná-las com o -o
sinalizador (ou). Isso fará com que find
procure por .log
ou .lst
arquivos. A -printf
(uma extensão GNU) imprime o mês de modificação do arquivo ( %TB
), depois seu ano de modificação ( %TY
) e depois seu caminho ( %p
), com uma tabulação ( \t
) entre cada campo.
O awk
simplesmente verifica se o primeiro campo (o mês) é igual a $month
e o segundo é igual a $year
.
Remove cut
os dois primeiros campos (mês e ano) e imprime tudo a partir do 3º campo.
Testei o acima criando arquivos modificados em dezembro de 2012 (e definidos $month
como "dezembro" e $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
(observe que ele assume que os nomes de arquivos e diretórios não contêm caracteres de nova linha).
Responder3
Experimente isto:
find $logfolder -type f -exec stat --format='%y %n' "{}" + |
grep "$year-$month-"|
awk -F' ' '{print $4}'|
grep 'log$\|lst$' > $archivepath/filesToArchive
Responder4
ls -lh *.log *.lst logfolder | grep year | grep month