두 가지 다른 유형의 파일 확장자의 압축을 풉니다.

두 가지 다른 유형의 파일 확장자의 압축을 풉니다.

여기서 .zip과 .jar은 예시일 뿐이며 파일 확장자는 다릅니다. 여러 개의 zip 파일을 포함할 수 있는 디렉터리가 있다고 가정해 보겠습니다.

a.zip b.zip c.zip

그리고/또는

z.jar x.jar y.jar

그리고 다른 콘텐츠.

모두 압축을 풀고 싶습니다.

나는 노력했다

unzip -q *.zip

그리고

unzip -q *.jar

그러나 폴더에 .jar 파일이 없으면 두 번째 명령이 실패합니다.

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

관련 정보