“/ usr / bin / stat: erro de lista de argumentos muito longa”

5

Eu preciso que a lista de arquivos ( .log/.lst ) esteja presente em um diretório ( $logfolder ) cuja data de criação esteja em uma% específica $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 consultar o comando para uma pasta onde há muitos arquivos. Eu recebo o seguinte erro:

-bash: /usr/bin/stat: Argument list too long
    
por DCL 25.06.2014 / 17:44

4 respostas

3

Para uma possibilidade engraçada, se o seu find manipular -newerXY , use-o! Por exemplo, para obter os arquivos do ano 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 , é fácil escrever como:

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

Apenas um comando find ! incrível!

    
por 25.06.2014 / 20:13
3

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

Agrupando as duas chamadas -name entre parênteses, você pode combiná-las com o sinalizador -o (ou). Isso fará com que find procure arquivos .log ou .lst . O -printf (uma extensão GNU) imprime o mês de modificação do arquivo ( %TB ), em seguida, seu ano de modificação ( %TY ) e 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 .

O cut remove os dois primeiros campos (mês e ano) e imprime tudo a partir do terceiro campo.

Eu testei o acima criando arquivos modificados em dezembro de 2012 (e defina $month para "dezembro" e $year para 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 os nomes de arquivos e diretórios não contêm caracteres de nova linha).

    
por 25.06.2014 / 19:20
1

Tente isto:

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

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

    
por 25.06.2014 / 17:48

Tags