Eu quero que o tar empacote um diretório completo
tar cvjf dir.tbz dir
Mas faça com que ele exclua todos os arquivos
tar cvjf dir.tbz dir --remove-files
No entanto, isso também remove ./dir. Então tentei fazer o cd no diretório antes de embalar
tar cvjf dir.tbz --remove-files -C dir .
Mas isso ainda remove ./dir... o que não faz sentido para mim, porque por que o tar deveria excluir o próprio diretório de trabalho? Não posso compactar um diretório completo e remover os arquivos após compactar sem excluir o diretório inteiro?
Tenho um processo em execução que cria arquivos constantemente em ./dir e quero compactar todos os arquivos a cada hora e depois remover os que estão compactados. Eu poderia mkdir após tar e excluir, mas isso poderia causar dificuldades no outro processo que cria arquivos ao tentar gravar um novo arquivo antes de mkdir ter recriado o diretório.
Responder1
Você poderia tentar algo assim:
find dir -type f -mmin +1 | xargs -I{} sh -c 'tar rvf dir.tar {} && rm {}'
bzip2 dir.tar && mv dir.tar.bz2 dir-$(date +%F-%T).tbz
É um pouco mais complicado do que o seu comando atual, mas funciona e não acredito que haja problemas de corrida (desde que um arquivo não seja gravado várias vezes com intervalos maiores que um minuto).
O find
comando encontra todos os arquivos dir
que têm pelo menos um minuto (portanto, não estão sendo gravados no momento). Essa lista é então canalizada para xargs
, que adiciona cada uma delas ao dir.tar
arquivo. Depois que o arquivo for adicionado com sucesso ao arquivo tar, o original será removido. Fazer isso um de cada vez evita problemas de linhas de comando muito longas se você tiver um grande número de arquivos. Finalmente você pode compactar e renomear o arquivo tar.
Responder2
Minha solução alternativa para isso seria a seguinte agora:
Eu escrevo um script que entra no diretório e tara o material usando ./* e depois exclui. Eu só esperava que -C fizesse o mesmo para que eu pudesse tê-lo em uma linha de comando, mas isso não acontece.
#!/bin/bash
cd /path/to/dir
tar cvjf dir.tbz ./* --remove-files
Deveria trabalhar.