Alcance todos os PDFs em um diretório, mantendo a estrutura de diretórios

11

Estou tentando criar um tarball compactado que contém todos os arquivos PDF que existem em um dos meus diretórios. A estrutura do diretório precisa ser mantida. Diretórios vazios não são necessários, mas eu realmente não me importo se eles estão lá.

Por exemplo, digamos que eu tenha um diretório com esta aparência:

dir
dir/subdir1
dir/subdir1/subsubdir1/song.mp3
dir/subdir2
dir/subdir2/subsubdir1
dir/subdir2/subsubdir1/document.pdf
dir/subdir2/subsubdir1/another-song.mp3
dir/subdir2/subsubdir1/top-ten-movies.txt
dir/subdir3
dir/subdir3/another-document.pdf

Depois de executar o comando, gostaria de ter dir.tar.gz contendo isso:

dir
dir/subdir2
dir/subdir2/subsubdir1
dir/subdir2/subsubdir1/document.pdf
dir/subdir3
dir/subdir3/another-document.pdf

Possível?

    
por Matt Alexander 10.01.2011 / 20:45

2 respostas

10

Isso listará todos os PDFs:

$ find dir/ -name '*.pdf'
./dir/subdir2/subsubdir1/document.pdf
./dir/subdir3/another-document.pdf

Você pode canalizar isso para xargs para obtê-lo como uma única linha delimitada por espaço e fornecer isso para tar para criar o arquivo:

$ find dir/ -name '*.pdf' | xargs tar czf dir.tar.gz

(Desta forma, omite os diretórios vazios)

    
por 10.01.2011 / 20:52
5

Com bash ≥4 ou zsh e o tar do GNU:

tar -czf dir.tar.gz dir/**/*.pdf

Isso pode não funcionar se você tiver um grande número de arquivos PDF e a linha de comando for muito longa. Então você precisaria de uma solução baseada em localização mais complexa (novamente, usando o GNU tar):

tar -cf dir.tar -T /dev/null
find dir -name '*.pdf' -exec tar -rf dir.tar {} +
gzip dir.tar

Como alternativa (e portável), você pode criar o arquivo com pax .

pax -w -x ustar -s '/\.pdf$/&/' -s '/.*//' . | gzip >dir.tar.gz

O primeiro -s diz para incluir todos os arquivos .pdf , sem alterar o nome deles. O segundo -s diz para renomear todos os outros arquivos para um nome vazio, o que na verdade significa não incluí-los no arquivo.

    
por 10.01.2011 / 21:27