web-dev-qa-db-ja.com

ディレクトリ構造を保持しながら、ディレクトリ内のすべてのPDFをtarアップします

ディレクトリの1つに存在するすべてのPDFファイルを含む圧縮tarballを作成しようとしています。ディレクトリ構造を保持する必要があります。空のディレクトリは必要ありませんが、実際には必要ありません。彼らがそこにいるかどうか気にしないでください。

たとえば、次のようなディレクトリがあるとします。

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

コマンドを実行した後、dir.tar.gzに次のものを含めたいと思います。

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

可能?

11
Matt Alexander

これにより、すべてのPDFが一覧表示されます。

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

これをxargsにパイプして単一のスペース区切り行として取得し、それをtarにフィードしてアーカイブを作成できます。

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

(この方法では、空のディレクトリが省略されます)

10
Michael Mrozek

Bash≥4またはzshおよびGNU tar:

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

PDFファイルが非常に多く、コマンドラインが長すぎる場合、これは機能しない可能性があります。その場合は、より複雑な検索ベースのソリューションが必要になります(ここでも、GNU tar):

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

あるいは(そして移植可能に) pax でアーカイブを作成することができます。

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

最初の-sは、名前を変更せずに、すべての.pdfファイルを含めることを示しています。 2番目の-sは、他のすべてのファイルの名前を空の名前に変更することを示しています。これは、実際にはそれらをアーカイブに含めないことを意味します。