Unix/Linux에서 다양한 zip 수준 파일이 포함된 압축 파일의 압축을 푸는 방법은 무엇입니까? [복사]

Unix/Linux에서 다양한 zip 수준 파일이 포함된 압축 파일의 압축을 푸는 방법은 무엇입니까? [복사]

예를 들어 내 폴더 이름은 테스트.zip

테스트.zip다음과 같은 다양한 zip 폴더가 포함되어 있습니다.te1.zip, te2.zip, te3.zip 심지어te1.zip다양한 zip 폴더가 포함되어 있습니다.

그래서 즉시 리눅스에서 압축을 풀어야 합니다.

이 작업을 수행하는 방법을 알려주시겠습니까?

답변1

이와 같은 짧은 스크립트가 작업을 수행해야 합니다(모든 것을 재귀적으로 처리하려면 스크립트가 원본 파일을 삭제해야 하므로 원본 파일을 백업해야 합니다).

while [ "$(find . -type f -name '*.zip' | wc -l)" -gt 0 ]; 
  do 
    find -type f -name '*.zip' -exec mkdir '{}'_dir \; \ 
                               -exec unzip -d '{}'_dir -- '{}' \; \
                               -exec rm -- '{}' \;
  done

-delete일부 시스템에서는 -exec rm -- '{}' \;.

  • 이 명령은 현재 디렉터리를 반복합니다(이 디렉터리는 Test.zip(또는 보유하고 있는 모든 zip 파일)만 사용할 수 있는 빈 디렉터리일 것으로 예상됩니다).
  • 발견된 각 아카이브에 대해 아카이브 이름 + _dir을 사용하여 새 디렉터리를 생성합니다(일부 아카이브에 이름이 일치하는 파일이 포함된 경우 충돌을 방지합니다).
  • 새로 생성된 디렉터리에 아카이브의 압축을 풀고 처리된 zip 파일을 삭제합니다.
  • 모든 파일이 처리되면 다시 반복하여 디렉터리 트리에서 zip 파일을 계속 사용할 수 있는지 확인합니다.
  • 내부 어딘가에 zip 폭탄이 있으면 스크립트가 무한 루프에 빠지게 됩니다.

답변2

이는 재귀 스크립트에 대한 훌륭한 후보입니다.

스크립트로 저장하세요(예를 들어 my_unzip.sh)그대로 명령줄에 붙여넣으면 작동하지 않습니다.:

#!/usr/bin/env bash

: ${1:?Please supply a file} # ${1} is the zip being fed to the script -- a little user-friendliness never went amiss
DIR="${1%.zip}" # this is where the current zip will be unzipped
mkdir -p "${DIR}" || exit 1 # might fail if it's a file already
unzip -n -d "${DIR}" "${1}" # unzip current zip to target directory
find "${DIR}" -type f -name '*.zip' -print0 | xargs -0 -n1 "${0}" # scan the target directory for more zips and recursively call this script (via ${0})

실행 가능하게 만들어라

chmod +x my_unzip.sh

zip 파일을 인수로 사용하여 실행하십시오.

my_unzip.sh /some/path/yourfile.zip

진행 상황을 설명하는 인라인 댓글과 함께 원본 파일을 보관하세요.

비겁하게도 이미 존재하는 것을 덮어쓰려고 시도하지 않습니다. 이 동작은 업데이트 unzip명령을 통해 제거하거나 -n, 힌트를 얻거나, -o강제 무시하도록 변경될 수 있습니다.

관련 정보