Erro "/usr/bin/stat: lista de argumentos muito longa"

Erro "/usr/bin/stat: lista de argumentos muito longa"

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 $yeare$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ê findtiver 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 findcomando! 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 -namechamadas entre parênteses, você pode combiná-las com o -osinalizador (ou). Isso fará com que findprocure por .logou .lstarquivos. 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 awksimplesmente verifica se o primeiro campo (o mês) é igual a $monthe o segundo é igual a $year.

Remove cutos 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 $monthcomo "dezembro" e $year2012):

$ 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

informação relacionada