特定のパスで zip ファイルを動的に検索し、解凍されたファイルと同じフォルダーに解凍しますか?

特定のパスで zip ファイルを動的に検索し、解凍されたファイルと同じフォルダーに解凍しますか?

特定のパス (例:/opt/uploading/"*"/multiple .zipファイル) 内の zip ファイルを動的に検索し、zip ファイルと同じフォルダーに解凍するにはどうすればよいでしょうか?

以下の関数は、複数の zip ファイルを解凍し、zip ファイルを削除します。ただし、解凍したファイルと一緒に zip ファイルも残しておきたいのです。

while true; do
   find -iname '*.zip' > zipindex
   test -s zipindex || break
   for zip in $(cat zipindex); do unzip -o $zip && rm $zip; done
done

答え1

rm $zip.Zip ファイルが削除されるので、削除します。

答え2

これはwhileループよりもforループに適しています。これにより、不要な結果の保存も不要になります。find -iname '*.zip' > zipindex

代わりに次のようにしてください:

#!/bin/bash

for zip in $(find -iname '*.zip'); do
    unzip -o $zip
done

これは、find が生成するすべての行を反復処理します。

もちろん、bash スクリプトを完全に廃止して、次のような find ワンライナーを作成する必要があります。

find -iname '*.zip' -execdir unzip {} \;

編集: @don_crissti と @ilkkachu のおかげで、-exec でシェルの別のインスタンスを呼び出す必要がなくなりました。-execdir は知っておいてよかったです!

答え3

GNU Parallel を使用すると、次のことが可能になります。

find my_dir | grep -E '\.zip$' | parallel unzip
inotifywait -qmre MOVED_TO -e CLOSE_WRITE --format %w%f my_dir | grep  -E '\.zip$' | parallel -u unzip

こうすることで、次の zip ファイルが表示されるまで待つ必要がなくなります。

関連情報