Tarはディレクトリ構造を維持しながら、ディレクトリ内のすべてのPDFを圧縮します。

Tarはディレクトリ構造を維持しながら、ディレクトリ内のすべてのPDFを圧縮します。

私のディレクトリの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ファイルを含めることを意味します。.pdf2番目は、-s他のすべてのファイルの名前を空の名前に変更することを意味します。これは、本質的にそのファイルをアーカイブに含めないことを意味します。

関連情報