ここで、.zipと.jarは単なる例であり、ファイル拡張子は異なります。複数のzipファイルを含めることができるディレクトリがあるとします。
a.zip b.zip c.zip
そして/または
z.jar x.jar y.jar
そして他のコンテンツ。
みんな解凍したいです。
頑張った
unzip -q *.zip
そして
unzip -q *.jar
ただし、フォルダに.jarファイルがない場合、2番目のコマンドは失敗します。
unzip: cannot find or open *.jar, *.jar.zip or *.jar.ZIP.
No zipfiles found.
私のスクリプトはエラーで終了するので、これは私にとって問題です。エラーなしで* .zipと* .jarを自動的に解凍したいと思います。これを達成する方法はありますか?
答え1
はい、nullglob
Bashでこれを使用できます。
$ shopt -s nullglob
$ tee foo.zip bar.zip </dev/null
$ echo *.zip *.jar
bar.zip foo.zip
このnullglob
オプションは、一致しない glob の動作をリテラル文字列になるものから完全に削除されるものに変更します。
unzip
ただし、パラメータを渡さないと何をすべきかわからないため、特定のユースケースではこれだけでは不十分です。まず、次のように解凍できるzip / jarがあることを確認する必要があります。
shopt -s nullglob
zips=( *.zip )
jars=( *.jar )
(( "${#zips[@]}" )) && unzip -q "${zips[@]}"
(( "${#jars[@]}" )) && unzip -q "${jars[@]}"
または一度に(該当する場合):
shopt -s nullglob
zipsandjars=( *.zip *.jar )
(( "${#zipsandjars[@]}" )) && unzip -q "${zipsandjars[@]}"
POSIXシェルでも同様のことができます。
for file in *.zip *.jar; do
if [ "$file" != "*.zip" ] && [ "$file" != "*.jar" ]; then
unzip -q "$file"
fi
done