2種類のファイル拡張子を解凍します。

2種類のファイル拡張子を解凍します。

ここで、.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

はい、nullglobBashでこれを使用できます。

$ 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

関連情報