特定のパス (例:/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 ファイルが表示されるまで待つ必要がなくなります。