ディレクトリの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
可能?
これにより、すべての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
(この方法では、空のディレクトリが省略されます)
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
は、他のすべてのファイルの名前を空の名前に変更することを示しています。これは、実際にはそれらをアーカイブに含めないことを意味します。