Obter lista de arquivos por grupo Data

4

Eu tenho um diretório com arquivos para todos os dias. Agora eu quero compactar os arquivos por datas. Existe alguma maneira de agrupar / listar os arquivos que caíram 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 nenhum sufixo / prefixo, pois todos são únicos. Agora, quando eu executar o comando que estou procurando, receberei um conjunto de linhas, como abaixo, com base no grupo por datas.

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

Com essa lista, vou percorrer e criar um arquivo

tar -zvcf Oct_14.tar.gz hello.txt world.txt a
    
por Anirban Nag 'tintinmj' 27.10.2016 / 18:18

3 respostas

3

Com zsh , usando uma matriz associativa cujas chaves são as datas e valores que a lista de arquivos delimitada por NUL modificou pela última vez nessa data:

zmodload -F zsh/stat b:zstat
typeset -A files
for file (./*) {
  zstat -LA date -F %b_%d +mtime $file &&
    files[$date]+=$file$'
find . ! -name . -prune ! -name '.*' -printf '%Tb_%Td:%p
zmodload -F zsh/stat b:zstat
typeset -A files
for file (./*) {
  zstat -LA date -F %b_%d +mtime $file &&
    files[$date]+=$file$'
find . ! -name . -prune ! -name '.*' -printf '%Tb_%Td:%p%pre%' |
  awk -v RS='%pre%' -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]
    }'
' } for date (${(k)files}) echo tar zcvf $date.tar.gz ${(0)files[$date]}
' | awk -v RS='%pre%' -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] }'
' } for date (${(k)files}) echo tar zcvf $date.tar.gz ${(0)files[$date]}

Remova o echo quando estiver satisfeito.

Observe que as abreviações do nome do mês ( %b formato strftime) estarão no idioma do local atual ( Oct em um sistema em inglês, Okt em um alemão, etc.). Para sempre criar nomes em inglês, independentemente da localidade do usuário, force a localidade para C com LC_ALL=C zstat... .

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

%pre%

Canalize para sh quando estiver feliz.

    
por 27.10.2016 / 22:57
2
while read date a b filename; do 
    zip -g ../$date.zip "$filename"
done <<< $(stat -c "%y %n" *)
    
por 27.10.2016 / 18:39
-1

Provavelmente eu não entendi 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 e. g. com horas usando grep extra "| grep 09:" etc. Em seguida, faça com a lista oct26.list o que você precisar.

    
por 28.10.2016 / 11:18

Tags