예를 들어 내 폴더 이름은 테스트.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
강제 무시하도록 변경될 수 있습니다.