여기서 .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
예, 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