回答:
それらを並行して本当に解凍したい場合は、次のようにすることができます
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
-exec
またはの-execdir
代わりにを使用しxargs
ます。理解しやすいだけでなく、エラーが発生しにくく、システムリソースの使用量も少なくなります。find . -name '*.zip' -exec unzip {} ';'
(セミコロンを引用する必要があります。)
-exec \;
(セミコロンをエスケープできます。引用符は不要です)、各コマンドを順番に実行します。-exec +
より良いが、それはそれがどのようにunzip
機能しないので、ここでは動作しません。
GNU並列コマンドは、事のこのタイプに適しています。後:
$ sudo apt-get install parallel
それから
ls *.zip | parallel unzip
これは、必要な数のコアを使用し、すべてのコアが完了するまで、各コアを解凍してビジー状態に保ちます。
echo *.zip
代わりに使用して、可能なlsエイリアスが余分な情報を忍び込まないようにすることをお勧めします。ただし、これには@Guruの答えと同じ問題があり、空白を含むファイル名で壊れます。
xargs
GNU Parallelとは対照的に、space / tab / quoteを含むファイル名ではブレークしません。ファイル名に改行が含まれる場合のみ、特別な注意が必要です。使って、例えば:parallel unzip ::: *.zip
echo
は、の使用と同じくらい悪いls
です。グロビングとwhileループが最も安全です。
.zip
フォルダー内に多くのファイルがあり、それらすべてを解凍したい場合は、ターミナルを開き、次を使用してフォルダーに移動します。
cd <path_to_folder>
次のコマンドを使用して、すべての.zip
ファイルを解凍します。
ls *.zip | xargs -n1 unzip
echo *.zip
するのを防ぐために代わりに使用することをお勧めしますls
が、それでも空白の問題は解決しません。
ls
その出力はバージョン間で明確に定義されていないため、スクリプトの出力に依存しないでください。代わりに、@ terdonからの回答をご覧ください。このソリューションのすべての問題が解決されます。
findは次の-exec
ように使用できますが、
find . -name "*.zip" -exec unzip {} \;
これは、ファイルの名前にスペースが含まれている場合に機能します。
unzip \*.zip
または unzip '*.zip'
明らかにunzip *.zip
シェルがそれを展開しているため、仕事をしないunzip foo.zip bar.zip ...
とunzip
zipファイルとして最初のファイル名を解釈し、そのzipファイルから抽出するファイルとして以下のファイル名。
ただし、unzip
独自のグロブ拡張を行うという点で、Unixコマンドでは少し珍しいです。*
がシェルによって展開されない場合、unzipはそれを行い、処理されるすべてのファイル名をzipファイルとして解釈します。そのため、この特別なケースでは、for
ループなどなしで逃げることができますxargs
。