ディレクトリ構造を保持しながら、ディレクトリ内のすべてのPDFを圧縮する


11

私のディレクトリの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

可能?

回答:


10

これにより、すべてのPDFがリストされます。

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

パイプでxargs区切って1つのスペース区切りの行として取得し、フィードtarを送信してアーカイブを作成できます。

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

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


1
それはとても素晴らしいです、助けてくれてありがとう。ここに私が思い付いたものです:find docs \( -iname '*.pdf' -o -iname '*.mp3' \) -printf '"%p"\n' | xargs tar czf docs-media.tar.gz
マット・アレクサンダー

3
@mattalexx:このコマンドは、ファイル名にスペースまたは\'"(xargsのエラー)が含まれている場合は機能せず、ファイル名が多すぎる(カーネルのエラー)場合は機能しないことに注意してください。
Gilles「SO-邪悪なことをやめ

2
@ギレススペースと一重引用符を含むファイル名に関しては、-printf '"%p"\n'パートがそれを処理します(少なくとも私にとってはそうでした)。
Matt Alexander

1
@Gillesカーネルの制限について興味深い。Linuxのコマンドで引数をいくつ持つことができますか?
マットアレクサンダー

5
ああ、「動作しません」では、ここでの失敗モードは、コマンドラインが長すぎる場合、xargsがそれを分割するため、最後のtar呼び出しが以前の呼び出しによって書き込まれたファイルを静かに上書きすることに注意してください。
Gilles「SO-邪悪なことをやめ

6

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

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


そうそう、私はzshについて言及するつもりだった**。私はbash 4が今それを持っていることにさえ気づいていませんでした
マイケル・ムロゼック
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.