Como compactar arquivos com base em uma data de arquivo

4

Eu tenho um mínimo de 30 arquivos em um diretório que contém datas mais antigas, por exemplo, nos últimos sete dias. Agora eu 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

    
por Dev 10.04.2017 / 20:00

1 resposta

4

O usual find -mtime é um pouco difícil de usar aqui, pois ele só testa a idade em relação ao ponto atual no tempo.

Com o GNU date e o 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

( date só pode ler a hora da modificação. Para ctime , precisaríamos usar stat e fazer mais trabalho para corrigir o formato de saída.)

Se, por algum motivo, precisarmos obter uma lista de todos os arquivos para uma determinada data antes do processamento, poderemos coletá-los em uma matriz:

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 apenas lida com uma única data determinada de cada vez.

    
por 10.04.2017 / 22:41

Tags