Como compactar arquivos com base na data do arquivo

Como compactar arquivos com base na data do arquivo

Eu tenho no mínimo 30 arquivos em um diretório que contém datas mais antigas, ou seja, dos últimos 7 dias. Agora preciso compactá-los com base na data de criação/modificação do arquivo.

Por exemplo,
10 arquivos com 7 de abril -- crie um zip para april7.zip
10 arquivos com 8 de abril -- crie um zip para april8.zip
10 arquivos com 9 de abril -- crie um zip para april9.zip

Responder1

O usual find -mtimeé um pouco difícil de usar aqui, pois testa apenas a idade em relação ao momento atual.

Com GNU date e Bash poderíamos fazer algo assim para adicionar cada arquivo a um arquivo correspondente à data do arquivo:

for f in * ; do 
    zip $(date -r "$f" +%F).zip "$f"        # 2017-04-07.zip
done

ou:

for f in * ; do
    d=$(date -r "$f" +%B%d)
    zip ${d,,}.zip "$f"                     # april07.zip
done                                        # ${var,,} is for lowercase

( datesó é possível ler a hora da modificação. Pois ctimeprecisaríamos usar state trabalhar mais para corrigir o formato de saída.)


Se, por algum motivo, precisarmos obter uma lista de todos os arquivos de uma determinada data antes do processamento, poderíamos coletá-los em um array:

files=()
date="2017-04-07"
for f in * ; do 
    [ "$(date -r "$f" +%F)" = "$date" ] && files+=("$f")
done
# do something with "${files[@]}', e.g.
# zip $date.zip "${files[@]}"

Como tal, isso lidaria apenas com uma única data por vez.

informação relacionada