Estou tentando criar um tarball compactado que contém todos os arquivos PDF existentes em um dos meus diretórios. A estrutura de diretórios 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 tivesse um diretório parecido com este:
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 dir.tar.gz
conter o seguinte:
dir
dir/subdir2
dir/subdir2/subsubdir1
dir/subdir2/subsubdir1/document.pdf
dir/subdir3
dir/subdir3/another-document.pdf
Possível?
find docs \( -iname '*.pdf' -o -iname '*.mp3' \) -printf '"%p"\n' | xargs tar czf docs-media.tar.gz
\'"
(falha de xargs) e não funcionará se houver muitos nomes de arquivo (falha do kernel).-printf '"%p"\n'
parte cuida disso (pelo menos para mim).Com bash ≥4 ou zsh e GNU tar:
Isso pode não funcionar se você tiver um número muito grande 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):
Como alternativa (e portabilidade), você pode criar o arquivo com pax .
O primeiro
-s
diz para incluir todos os.pdf
arquivos, sem alterar o nome. O segundo-s
diz para renomear todos os outros arquivos com um nome vazio, o que realmente significa não incluí-los no arquivo morto.fonte
**
; Eu nem sabia que o bash 4 tinha isso agora