중첩된 for 루프

중첩된 for 루프

아래와 같이 중첩된 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

bsdtarlibarchive 와 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

관련 정보