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

4

Eu tenho um comando de backup que se parece com isso:

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 pasta vazia, quando todos os arquivos neles não são alterados, portanto, não são incluídos no backup incremental. Eu estou procurando uma maneira de evitar isso, mas as únicas soluções que eu encontrei (canalizando os resultados de encontrar tar como argumentos com xargs) só funciona quando você tem uma pasta, eu tenho três deles. / p>     

por entropid 04.09.2013 / 13:06

2 respostas

5

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

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

ATUALIZAÇÃO PRINCIPAL: Primeiro eu preciso me desculpar seriamente pelo meu desleixado copiar-colar. Era um post 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 que faz a mesma pergunta em um fórum diferente e recebe uma resposta totalmente diferente. Eu tinha marcado tanto quando eu encontrei o problema e dei 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 novo que" o cara está perguntando.

Em vez disso, a parte que você precisa encontrar é assim:

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

É claro que você precisa substituir o ponto (".") pelo caminho onde você precisa encontrar / tar para iniciar. 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 minha falta de atenção aos detalhes.

    
por 04.09.2013 / 16:19
4

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

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

Se você tiver um grande conjunto de alterações, você pode despejar a lista de arquivos alterados em um arquivo e usar o parâmetro --files-from no 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
    
por 10.01.2014 / 12:56

Tags