複数のディレクトリを個々のzipファイルに圧縮するコマンド


40

その中に数十のディレクトリを含む単一のディレクトリがあります。

私はコマンドラインが初めてで、各サブディレクトリを一意のsub-directory.zipファイルに圧縮するコマンドを思いつくのに苦労しています。

最終的に、プライマリディレクトリには、元のすべてのサブディレクトリと、.zip各サブディレクトリの圧縮されたコンテンツを含む対応するファイルが格納されます。

このようなことは可能ですか?もしそうなら、それがどのように行われたかを教えてください。


シェルで「forループ」を実行する方法を調べることをお勧めします。あなたが望むことをすることができるオンラインがありますが、素敵なループははるかに明確になります。
lynxlynxlynx

つまり、別のシェルスクリプトを作成して、コマンドラインからそのスクリプトを呼び出す必要があるということですか?このような素朴な質問で申し訳ありません。プログラミングの経験はありますが、これは私にとって新しいものです。
エブスター

回答:


75

このループはbash次の場所で使用できます。

for i in */; do zip -r "${i%/}.zip" "$i"; done

iループ変数の名前です。*/は、現在のディレクトリのすべてのサブディレクトリを意味し、それらの名前の末尾にスラッシュが含まれます。cdこれを実行する前に、適切な場所にいることを確認してください。"$i"末尾のスラッシュを含めて、単にそのディレクトリに名前を付けます。引用符は、ディレクトリ名の空白が問題を引き起こさないようにします。${i%/}は似て$iいますが、末尾のスラッシュが削除されているため、これを使用してzipファイルの名前を作成できます。

これがどのように機能するかを確認したい場合は、echo前にを含めるzipと、コマンドが実行される代わりに印刷されます。


ありがとう しかし、私が考えた1つの潜在的な問題:これは、各サブディレクトリ内のすべてのディレクトリを別々のファイルに圧縮しますか?第1レベルのサブディレクトリを単一の圧縮ファイルとして圧縮したいだけです。第2レベル、第3レベルのサブディレクトリなどに追加のzipファイルを作成したくありません。それが理にかなっている場合はお知らせください。再度、感謝します!
エブスター

あなたが要求したような最初のレベルのものだけ。
lynxlynxlynx

*/すべての子孫ディレクトリではなく、すべての直接サブディレクトリの名前。したがって、最上位レベルのzipのみを取得し、希望どおりに取得します。その中のバージョンはecho、その側面を示したでしょう。ネストされたすべてのディレクトリを独自のファイルに圧縮することは、実際にはより多くの作業が必要であり、おそらくfind -type d他のトリックを使用して解決するのが最善です。
MvG

1
@fritzmg:Linuxでのローカルテストでは、はい、ドットで始まるファイルが含まれていることが示唆されています。これは、私が提供したコマンドではなく、Info-ZIPツールのプロパティになるため、zipバイナリが何であるかによって、異なる動作が発生する場合があります。ドットで始まる最上位ディレクトリ(つまり、現在のディレクトリの子)のzipファイルも作成するために、shopt -s dotglobグロブパターンを隠しファイルにも一致させることができます。
MvG

1
ルートとして親ディレクトリを持たないzipを作成するには:for i in */; do (cd "$i"; zip -r "../${i%/}.zip" .); done
chris
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.