tar: como posso excluir diretórios intermediários, mas incluir diretórios de folhas?

6

Eu quero criar um arquivo tar adequado para extração em / . Eu criei um diretório de trabalho que representa a raiz do sistema de arquivos, e ele tem todas as coisas que eu quero incluir no tar abaixo, como: etc/rc.d/init.d/glassfish3 , opt/glassfish3/... e outros diretórios e arquivos em opt/... .

Quando eu faço tar zcvpf files.tgz * , ele inclui os diretórios intermediários (como etc , etc/rc.d e opt ) no arquivo tar. Então, quando eu extraí-lo em / em outro sistema, ele tem o comportamento indesejável de mucking com propriedade e permissões nesses diretórios. Eu realmente quero deixar as pessoas sozinhas e não tocá-las.

Então, achei que encontrei uma boa maneira de contornar isso com:

find . -type f -print0 | tar zcvpf files.tgz --null --files-from -

que cria um tar que inclui apenas arquivos. Isso é ótimo, ele só pega os arquivos que eu coloco lá ... exceto que acabei de descobrir que não está pegando diretórios importantes, como:

opt/glassfish3/glassfish/lib/asadmin

que é um diretório vazio (e necessário para o Glassfish3, ou ele irá reclamar).

Como eu posso criar um arquivo tar que pule diretórios intermediários, mas não diretórios finais? Eu tenho a sensação de que algum achado + magic awk pode fazer isso. Não precisa ser um one-liner, a legibilidade é importante. Obrigado.

Editar : eu encontrei isso. Outras / melhores ideias são bem-vindas:

cat <(find . -type f -print0) <(find . -type d -empty -print0) | tar zcvpf files.tgz --null --files-from -
    
por Steve Kehlet 19.12.2012 / 02:02

1 resposta

4

find pode usar -o para "ou", então você pode combinar seus dois comandos find assim:

find . \( -type f -o -type d -empty \) -print0 | tar ...

Ou, se você puder garantir que todos os arquivos podem caber em uma linha de comando,

find . \( -type f -o -type d -empty \) -exec tar cvfz files.tgz {} +
    
por 19.12.2012 / 05:24

Tags