tar: Como remover arquivos após compactar, mas manter o diretório

tar: Como remover arquivos após compactar, mas manter o diretório

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 findcomando encontra todos os arquivos dirque 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.tararquivo. 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.

informação relacionada