아래와 같이 중첩된 zip 파일을 나열하려고 합니다. 두 번째 수준 파일은 나열되지 않습니다.
예를 들어:
abc.zip
포함하다 test1.zip
, test2.zip
,test3.zip
pqr.zip
포함하다 test4.zip
, test5.zip
,test6.zip
for f in *.zip
do
unzip -l ${f}
for p in ${f}
do
unzip -l ${p}
done
done
답변1
bsdtar
libarchive 와 GNU를 결합하면 tar
이러한 중첩 아카이브의 내용을 디스크에 추출하지 않고도 나열할 수 있습니다.
for f in *.zip; do
bsdtar -cf - --include='*.zip' "@$f" | tar -xf - --to-command='bsdtar tvf -'
done
GNU는 tar
추출 시 아카이브 멤버를 명령으로 파이프할 수 있지만 아카이브 형식 --to-command
만 지원합니다 .tar
bsdtar
다양한 아카이브 형식이 지원됩니다 tar
(포함 zip
). GNU와 동등한 것은 없지만 tar
( --to-command
내가 아는 한) 아카이브 형식은 즉시 변환될 수 있습니다.
답변2
실제로 최상위 파일을 하위 폴더로 추출하지 않으면 이 작업을 수행할 수 없습니다.
이 같은:
set -e
for f in *.zip
do
n=`basename -- "${f}" .zip`
mkdir -- "${n}"
cd -- "${n}"
unzip ../"${f}"
for p in *.zip
do
unzip -l -- "${p}"
done
cd ..
rm -rf -- "${n}"
done
이미 존재 하는지 확인 ${n}
하고 존재하는 경우 오류를 생성해야 합니다. 하위 디렉터리에 임시 파일 이름을 사용할 수도 있습니다.
dir=`mktemp -d zip-files.XXXXXX`
cd "${dir}"
그런 다음 일단 완료 하십시오 rm -rf "${dir}"
.
고쳐 쓰다:
set -e
문제가 발생하면 스크립트가 중지되도록 하는 데 사용됩니다 . 특히, mkdir -- "${m}"
실패 하면 cd -- "${m}"
역시 실패하므로 cd ..
잘못된 디렉터리 수준에 놓이게 되고, 여기서 rm -rf -- "${n}"
위험해집니다.
cd ..
명령문을 더 안전하게 만드는 또 다른 방법은 for
다음과 같이 반복하기 전에 디렉터리를 기억하고 경로를 사용하는 것입니다.
topdir=`pwd`
for ...
do
...
cd "$topdir" # instead of `cd ..`
...
done
이런 식으로 의지는 rm -rf -- "${n}"
에서만 작동할 수 있습니다 $topdir
.
임시 디렉토리를 사용하면 디렉토리 생성/삭제가 최상위 zip 파일의 파일 이름에 관계없이 예상대로 작동하므로 보안이 더욱 강화됩니다.
답변3
GNU Parallel이 설치된 경우:
extract_list() {
mkdir "$1"
cd "$1"
unzip ../"$1".zip
parallel unzip -l ::: *.zip
cd ..
rm -rf "$1"
}
export -f extract_list
parallel extract_list {.} ::: *.zip