
Necesito obtener la lista de archivos ( .log/.lst
) presentes en un directorio ( $logfolder
) cuya fecha de creación está en un lugar específico $year
y$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 find
manejas -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 year
y month
es sencillo escribirlas como:
find "$logfolder" \( -name '*.log' -o -name '*.lst' \) -newermt "$year-$month-01" \! -newermt "$year-$month-01 +1 month"
¡Solo un find
comando! ¡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 -name
llamadas entre paréntesis, puede combinarlas con la -o
bandera (o). Esto hará que find
busque archivos .log
o .lst
. (una extensión GNU) imprime el -printf
mes 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 awk
verifica que el primer campo (el mes) sea el mismo $month
y el segundo sea el mismo $year
.
Elimina cut
los 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 $month
en "diciembre" y $year
en 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