É possível excluir diretórios vazios ao criar um tar?

É possível excluir diretórios vazios ao criar um tar?

Eu tenho um comando de backup parecido com este:

tar cvpzf /backup/incremental-$now.tar.gz --after-date='1 day ago' -C / etc/ home/ root/  --exclude-from=/root/exclusion_list.txt --warning=no-file-unchanged > /backup/log-$now.txt 2>&1

O problema é que também inclui pastas vazias, quando todos os arquivos contidos nelas permanecem inalterados e não são incluídos no backup incremental. Estou procurando uma maneira de evitar isso, mas as únicas soluções que encontrei (canalizar os resultados de find para tar como argumentos com xargs) funcionam apenas quando você tem uma pasta, eu tenho três delas.

Responder1

Por padrão, o tar não fornece um meio de ignorar diretórios vazios. Dito isto, não é muito trabalhoso extrair um script simples do nada para fazer o que precisa ser feito.

Aquié um fórum de discussão onde encontrei exatamente a solução para o mesmo problema, quando surgiu a necessidade.

ATUALIZAÇÃO PRINCIPAL: Primeiro, preciso me desculpar seriamente pela minha colagem desleixada. Foi uma postagem tarde da noite e eu não estava no auge do meu intelecto...

A postagem correta no fórum éaqui. Na verdade é a mesma pessoa fazendo a mesma pergunta em um fórum diferente e obtendo uma resposta totalmente diferente. Eu marquei ambos quando encontrei o problema e forneci o link para o errado.

Na verdade, o que mostra aqui é a maneira de "canalizar" a saída do comando find para o tar. Você tem que ignorar todas as coisas sobre "mais recente do que" o cara está perguntando.

Em vez disso, a parte de localização que você precisa é assim:

find . -type d ! -empty | ...

É claro que você deve substituir o ponto (".") pelo caminho onde você precisa iniciar o find/tar. Após o pipe, continue com o comando tar conforme o segundo link (o correto).

Mais uma vez, lamento profundamente se causei algum problema com a minha falta de atenção aos detalhes.

Responder2

Outra maneira que só funciona se você tiver apenas um pequeno conjunto de arquivos alterado é:

tar cvzf [...] `find . -mtime -1 -type f`

Se você tiver um grande conjunto de alterações, poderá despejar a lista de arquivos alterados em um arquivo e usar o parâmetro --files-from em seu comando tar:

find . -mtime -1 -type f > /tmp/changed.txt
tar cvzf [...] --files-from=/tmp/changed.txt

ou em uma linha

find . -mtime -1 -type f | tar cvzf [...] --files-from=/dev/stdin

informação relacionada