私のディレクトリの1つにあるすべてのPDFファイルを含む圧縮されたターボールを作成しようとしています。ディレクトリ構造を保存する必要があります。空のディレクトリは必要ありませんが、ディレクトリがあるかどうかはあまり気にしません。
たとえば、次のようなディレクトリがあるとします。
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
可能ですか?
答え1
これにより、すべての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
(このアプローチは空のディレクトリを省略します)
答え2
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 -w -x ustar -s '/\.pdf$/&/' -s '/.*//' . | gzip >dir.tar.gz
1つ目は、名前を変更せずにすべての-s
ファイルを含めることを意味します。.pdf
2番目は、-s
他のすべてのファイルの名前を空の名前に変更することを意味します。これは、本質的にそのファイルをアーカイブに含めないことを意味します。