複数のファイルを一度に解凍する


27

.zip1つのフォルダーに200を超えるファイルがあります。これらを1つずつ解凍したくありません。単一のコマンドまたはスクリプトを使用してそれらを抽出します。どうやってするか。

回答:


38

それらを並行して本当に解凍したい場合は、次のようにすることができます

for i in *zip; do unzip "$i" & done

ただし、その場合、N個の.zipファイルに対してN個のプロセスが起動され、システムに非常に負荷がかかる可能性があります。一度に10個の並列プロセスのみを起動する、より制御されたアプローチについては、これを試してください:

find . -name '*.zip' -print0 | xargs -0 -I {} -P 10 unzip {}

起動する並列プロセスの数を制御するには、必要-Pなものに変更します。サブディレクトリに再帰したくない場合は、代わりにこれを行います:

find . -maxdepth 1 -name '*.zip' -print0 | xargs -0 -I {} -P 10 unzip {}

または、@ OleTangeがコメントで示唆しいるようにGNU parallelをインストールして実行することもできます

parallel unzip ::: *zip

3
並行して実行するのは良い考えですが、ディスクI / Oが大きなボトルネックになることはありませんか?
水田ランダウ14年

1
@PaddyLandauわからない、私は確認する必要があります。それは、解凍アルゴリズムの速度と想像するディスクの速度に依存します。
テルドン14年

-execまたはの-execdir代わりにを使用しxargsます。理解しやすいだけでなく、エラーが発生しにくく、システムリソースの使用量も少なくなります。find . -name '*.zip' -exec unzip {} ';'(セミコロンを引用する必要があります。)
水田Landau

@PaddyLandauがxargsにパイプしている唯一の理由は、OPが要求したとおりに並行して実行することです。-exec \;(セミコロンをエスケープできます。引用符は不要です)、各コマンドを順番に実行します。-exec +より良いが、それはそれがどのようにunzip機能しないので、ここでは動作しません。
テルドン14年

私たちはOPを異なって理解したと思います。あなたは彼が並行してそれを望んでいると読みましたが、私は彼を複数のコマンドではなく単一のコマンドを意味すると理解しました。さて、彼は今両方の方法を持っています:)
パディランダウ

17

GNU並列コマンドは、事のこのタイプに適しています。後:

$ sudo apt-get install parallel

それから

ls *.zip | parallel unzip

これは、必要な数のコアを使用し、すべてのコアが完了するまで、各コアを解凍してビジー状態に保ちます。


echo *.zip代わりに使用して、可能なlsエイリアスが余分な情報を忍び込まないようにすることをお勧めします。ただし、これには@Guruの答えと同じ問題があり、空白を含むファイル名で壊れます。
nyuszika7h 14年

1
@ nyuszika7h xargsGNU Parallelとは対照的に、space / tab / quoteを含むファイル名でブレークしませ。ファイル名に改行が含まれる場合のみ、特別な注意が必要です。使って、例えば:parallel unzip ::: *.zip
オーレ丹下

@ nyuszika7h-これらは、標準コマンドのエイリアシングファイル名にスペース入れることの両方を避ける良い理由です。
ウェインコンラッド14年

@ nyuszika7hの使用echoは、の使用と同じくらい悪いlsです。グロビングとwhileループが最も安全です。
テルドン14年

1
@NateEldredgeその可能性はシステムに磁気ディスクが1つしかなかった時代にさかのぼりますが、最近では複数のスピンドルとフラッシュディスクを備えたRAIDではその可能性は小さくなっています。最善の方法は、もちろんシステムがどのように動作するかを測定して確認することです。最近、I / Oが必要なプロセスの最適な並列性が10である40スピンドルRAIDを使用しました。10倍のスピードアップは得られませんでした。
オレタンゲ14

12

次のコマンドを使用できます。

最初に、ターミナルのディレクトリを.zipファイルを含むディレクトリに変更します。

cd /path

次に、このコマンドを実行して、すべての.zipファイルを解凍します。

for z in *.zip; do unzip "$z"; done

10

.zipフォルダー内に多くのファイルがあり、それらすべてを解凍したい場合は、ターミナルを開き、次を使用してフォルダーに移動します。

cd <path_to_folder>

次のコマンドを使用して、すべての.zipファイルを解凍します。

ls *.zip | xargs -n1 unzip

3
ファイル名に空白が含まれている場合、これは失敗します。
テルドン14年

1
はい。それで合っています。
g_p

エイリアスが余分な情報を潜入echo *.zipするのを防ぐために代わりに使用することをお勧めしますlsが、それでも空白の問題は解決しません。
nyuszika7h

1
@OleTange気付かなかった場合、ファイル名に空白文字が含まれていると、まだ失敗すると言いました。
nyuszika7h 14年

1
lsその出力はバージョン間で明確に定義されていないため、スクリプトの出力に依存しないでください。代わりに、@ terdonからの回答をご覧ください。このソリューションのすべての問題が解決されます。
水田ランダウ14年

6

findは次の-execように使用できますが、

find . -name "*.zip" -exec unzip {} \;

これ、ファイルの名前にスペースが含まれている場合に機能します。


3

非終端メソッド。

zipファイルを選択し、1つを右クリックしてを選択しますextract here。一度にすべてまたはいくつかのzipファイルを選択できます。


1

unzip \*.zip または unzip '*.zip'

明らかにunzip *.zipシェルがそれを展開しているため、仕事をしないunzip foo.zip bar.zip ...unzipzipファイルとして最初のファイル名を解釈し、そのzipファイルから抽出するファイルとして以下のファイル名。

ただし、unzip独自のグロブ拡張を行うという点で、Unixコマンドでは少し珍しいです。*がシェルによって展開されない場合、unzipはそれを行い、処理されるすべてのファイル名をzipファイルとして解釈します。そのため、この特別なケースでは、forループなどなしで逃げることができますxargs

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.