Obtenha uma lista de arquivos agrupados por data

Obtenha uma lista de arquivos agrupados por data

Eu tenho um diretório com arquivos que chegam todos os dias. Agora quero compactar esses arquivos agrupados por datas. Existe alguma maneira de agrupar/listar os arquivos que chegaram na mesma data.

Suponha que haja arquivos abaixo em um diretório

-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

Portanto não há como agrupar os arquivos com qualquer sufixo/prefixo, pois todos são únicos. Agora, quando executar o comando que estou procurando, obterei um conjunto de linhas como abaixo, com base no agrupamento por datas.

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

Com essa lista vou percorrer e arquivar

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

Responder1

Com zsh, usando uma matriz associativa cujas chaves são as datas e os valores da lista de arquivos delimitados por NUL modificados pela última vez naquela data:

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]}

Remova o echoquando estiver feliz.

Observe que as abreviações dos nomes dos meses ( %bformato strftime) estarão no idioma da localidade atual ( Octem um sistema inglês, Oktem alemão, etc.). Para sempre criar nomes em inglês, independentemente da localidade do usuário, force a localidade Ccom LC_ALL=C zstat....

Com as ferramentas GNU, você poderia fazer o equivalente com:

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]
    }'

Pipe para shquando estiver feliz.

Responder2

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

Responder3

Provavelmente eu entendi mal a pergunta, mas

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

dará a lista de arquivos para 26 de outubro; o mesmo poderia ser feito, por exemplo, com horas usando grep extra "| grep 09:" etc. Em seguida, faça com a lista oct26.list o que você precisar.

informação relacionada