Obtener lista de archivos agrupados por fecha

Obtener lista de archivos agrupados por fecha

Tengo un directorio con archivos para todos los días. Ahora quiero comprimir esos archivos agrupados por fechas. ¿Hay alguna forma de agrupar/enumerar los archivos que llegaron en la misma fecha?

Supongamos que hay archivos debajo en un directorio

-rw-r--r--. 1 anirban anirban    1598 Oct 14 07:19 hello.txt
-rw-r--r--. 1 anirban anirban    1248 Oct 14 07:21 world.txt
-rw-rw-r--. 1 anirban anirban  659758 Oct 14 11:55 a
-rw-rw-r--. 1 anirban anirban    9121 Oct 18 07:37 b.csv
-rw-r--r--. 1 anirban anirban     196 Oct 20 08:46 go.xls
-rw-r--r--. 1 anirban anirban    1698 Oct 20 08:52 purge.sh
-rw-r--r--. 1 anirban anirban   47838 Oct 21 08:05 code.java
-rw-rw-r--. 1 anirban anirban 9446406 Oct 24 05:51 cron
-rw-rw-r--. 1 anirban anirban  532570 Oct 24 05:57 my.txt
drwxrwsr-x. 2 anirban anirban      67 Oct 25 05:05 look_around.py
-rw-rw-r--. 1 anirban anirban   44525 Oct 26 17:23 failed.log

Por lo tanto, no hay forma de agrupar los archivos con ningún sufijo/prefijo, ya que todos son únicos. Ahora, cuando ejecute el comando que estoy buscando, obtendré un conjunto de líneas como las siguientes basadas en fechas de grupo.

[ [hello.txt world.txt a] [b.csv] [go.xls purge.sh] [code.java] ... ] and so on.

Con esa lista la recorreré y crearé un archivo.

tar -zvcf Oct_14.tar.gz hello.txt world.txt a

Respuesta1

Con zsh, usando una matriz asociativa cuyas claves son las fechas y valores de la lista delimitada por NUL de archivos modificados por última vez en esa fecha:

zmodload -F zsh/stat b:zstat
typeset -A files
for file (./*) {
  zstat -LA date -F %b_%d +mtime $file &&
    files[$date]+=$file$'\0'
}
for date (${(k)files})
  echo tar zcvf $date.tar.gz ${(0)files[$date]}

Retire el echocuando esté satisfecho.

Tenga en cuenta que las abreviaturas de los nombres de los meses ( %bformato strftime) estarán en el idioma local actual ( Octen un sistema inglés, Oktalemán, etc.). Para que siempre sean nombres en inglés independientemente de la configuración regional del usuario, fuerce la configuración regional Ccon LC_ALL=C zstat....

Con las herramientas GNU, podrías hacer el equivalente con:

find . ! -name . -prune ! -name '.*' -printf '%Tb_%Td:%p\0' |
  awk -v RS='\0' -F : -v q=\' '
    function quote(s) {
      gsub(q, q "\\" q q, s)
      return q s q
    }
    {
      date=$1
      sub(/[^:]*:/, "", $0)
      files[date] = files[date] " " quote($0)
    }
    END {
      for (date in files)
        print "tar zcvf " quote(date ".tar.gz") files[date]
    }'

Pipa shcuando sea feliz.

Respuesta2

while read date a b filename; do 
    zip -g ../$date.zip "$filename"
done <<< $(stat -c "%y %n" *)

Respuesta3

Probablemente entendí mal la pregunta, pero

ls -ls |grep '26 de octubre' > oct26.list

dará la lista de expedientes del 26 de octubre; Se podría hacer lo mismo, por ejemplo, con horas usando grep extra "| grep 09:", etc. Luego haga con la lista oct26.list lo que necesite.

información relacionada