Você pode usar xargs -n 1 para enviar apenas um único argumento de arquivo o comando comprimir .
Tenha cuidado com os espaços.
Em /opt/abc
, tenho um caminho no qual uma nova pasta é criada diariamente. Nessa pasta, uma série de arquivos é criada.
Gostaria de executar um script todos os domingos às 02:00 e compactar cada pasta com mais de 2 dias. Eu não gostaria de ter tudo compactado em uma pasta, mas cada pasta para compactar individualmente. Se a compactação for bem-sucedida, a pasta original poderá ser excluída.
Eu tentei criar um script, mas tudo o que ele faz é compactá-los em um único arquivo. também não elimina as pastas originais.
Como devo proceder?
find /path/to/directory -mtime +2 -exec ls "{}" \;
É um snippet útil para listar arquivos com mais de dois dias, apesar de contar apenas dias completos, e há um elemento de arredondamento que acontece lá. Portanto, usar minutos com a opção -mmin
pode funcionar melhor. Eu também vi as pessoas relé a -exec
com print0
e canalizar a saída para xargs
, lida com nomes de arquivos incomuns melhor do que echo
faria. Você pode especificar o tipo de arquivo que o find
está procurando também, para fazer com que ele só encontre diretórios, acho que essa é a opção -type
Você pode substituir o ls
no comando por outros comandos, geralmente uso ls para ter certeza de que estou satisfeito com a saída e, em seguida, substituo-o por mv /path/to/target
ao remover arquivos com uma determinada idade. Suponho que você poderia usar um comando tar
no lugar do ls
para obter a compactação desejada.
Você pode fazer o script e chamar o script como cron
job, cron
é o agendador de scripts no Ubuntu (e em outros sistemas linux).
Isso deve começar com você!
Esse comando único deve fazer o trabalho, então ele pode simplesmente ser inserido no seu crontab:
find /opt/abc/* -maxdepth 0 -mtime +2 ! -name '*.tar.gz' -exec tar czf {}.tar.gz {} \; -exec rm -rf {} \;
Eu não testei tão bem, mas tenho certeza de que isso não excluirá acidentalmente as coisas.
No entanto, ele excluirá archives se eles tiverem o mesmo nome que um diretório em questão antes do .tar.gz
, pois o tar GNU sobrescreverá, se a opção de criação, c
, for fornecida. Será mais seguro se você arquivar em outro diretório:
find /opt/abc/* -maxdepth 0 -mtime +2 ! -name '*.tar.gz' -exec tar czf /opt/abcompressed/{}.tar.gz {} \; -exec rm -rf {} \;
Além disso, os arquivos conterão a estrutura de diretórios /opt/abc/<dirname>/<files>
, que eu ainda não consegui resolver.