Error "/usr/bin/stat: Lista de argumentos demasiado larga"

Error "/usr/bin/stat: Lista de argumentos demasiado larga"

Necesito obtener la lista de archivos ( .log/.lst) presentes en un directorio ( $logfolder) cuya fecha de creación está en un lugar específico $yeary$month

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

Esto no funciona cuando consulto el comando en una carpeta donde hay demasiados archivos. Obtuve el siguiente error:

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

Respuesta1

Para una posibilidad divertida, si lo findmanejas -newerXY, ¡úsala! Por ejemplo para obtener los archivos del año 1977 y mes de octubre:

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

¡Hecho!

Como ya tienes las variables yeary monthes sencillo escribirlas como:

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

¡Solo un findcomando! ¡asombroso!

Respuesta2

Yo lo haría así:

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- 

Explicación

Al agrupar las dos -namellamadas entre paréntesis, puede combinarlas con la -obandera (o). Esto hará que findbusque archivos .logo .lst. (una extensión GNU) imprime el -printfmes de modificación del archivo ( %TB), luego su año de modificación ( %TY) y luego su ruta ( %p), con una tabulación ( \t) entre cada campo.

Simplemente awkverifica que el primer campo (el mes) sea el mismo $monthy el segundo sea el mismo $year.

Elimina cutlos dos primeros campos (el mes y el año) e imprime todo desde el tercer campo en adelante.

Probé lo anterior creando archivos modificados en diciembre de 2012 (y configurados $monthen "diciembre" y $yearen 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

(tenga en cuenta que se supone que los nombres de archivos y directorios no contienen caracteres de nueva línea).

Respuesta3

Prueba esto:

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

Respuesta4

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

información relacionada