it-swarm-ko.tech

중첩 된 Zip 파일 추출

나는 수많은 Zip 아카이브를 가지고 있으며, 각 아카이브에는 여러 개의 Zip 아카이브가 포함되어 있습니다. Zip 아카이브 자체가 아닌이 Zip 아카이브 및 하위 Zip 아카이브에 포함 된 모든 파일을 재귀 적으로 추출하는 가장 좋은 방법은 무엇입니까?

15
oadams

그러면 그 안에 포함 된 zip 파일을 제외한 모든 Zip 파일이 현재 디렉토리에 추출됩니다.

find . -type f -name '*.Zip' -exec unzip -- '{}' -x '*.Zip' \;

이렇게하면 콘텐츠가 현재 디렉터리로 추출되지만 콘텐츠에 하위 디렉터리가 포함될 수 있으므로 모든 파일이 엄격하게이 디렉터리에있는 것은 아닙니다.

실제로 현재 디렉토리의 모든 파일을 엄격히 원하면 다음을 실행할 수 있습니다.

find . -type f -mindepth 2 -exec mv -- '{}' . \;

참고 : 서로 다른 디렉토리에 동일한 이름을 가진 파일이 두 개 있으면 파일이 손상됩니다.

모든 Zip 파일과 그 안에 포함 된 zip을 반복적으로 추출하려는 경우 다음은 현재 디렉터리에있는 모든 Zip 파일과 그 안에 포함 된 모든 zip을 현재 디렉터리에 추출합니다.

while [ "`find . -type f -name '*.Zip' | wc -l`" -gt 0 ]
do
    find . -type f -name "*.Zip" -exec unzip -- '{}' \; -exec rm -- '{}' \;
done
13
Shawn J. Goff

내가 아는 한, Zip 아카이브가 포함 된 Zip 아카이브가 있으며, 압축을 풀 때마다 중첩 된 zip 압축을 풀고 싶습니다.

다음은 현재 디렉터리와 하위 디렉터리의 모든 zip을 반복적으로 압축 해제하고 압축을 푼 후 각 Zip 파일을 제거하며 Zip 파일이있는 한 계속 진행하는 bash 4 스크립트입니다. 하위 디렉토리에있는 Zip 파일은 해당 하위 디렉토리를 기준으로 추출됩니다. 경고 : 테스트되지 않은 경우 시도하기 전에 원본 파일을 백업하거나 Zip 파일 디렉토리 트리 외부을 이동하여 rm을 (를) 대체하십시오.

shopt -s globstar nullglob
while set -- **/*.Zip; [ $# -ge 1 ] do
  for z; do
    ( cd -- "$(dirname "$z")" &&
      z=${z##*/} &&
      unzip -- "$z" &&
      rm -- "$z"
    )
  done
done

스크립트는 shopt 줄을 setopt nullglob로 바꾸면 zsh에서도 작동합니다.

여기에 휴대용 등가물이 있습니다. 종료 조건은 find가 파일을 찾았는지 여부를 나타내는 상태를 자발적으로 반환하지 않기 때문에 약간 복잡합니다. 경고 : 위와 같습니다.

while [ -n "$(find . -type f -name '*.Zip' -exec sh -c '
    cd "${z%/*}" &&
    z=${z##*/} &&
    unzip -- "$z" 1>&2 &&
    rm -- "$z" &&
    echo 1
')" ]; do :; done

unzip는 이것을하지 않습니다. 왜냐하면 UNIX 방식은 한 가지를 잘 수행하는 것이기 때문입니다. 모든 도구에서 모든 미친 특수한 경우를 처리하는 것은 아닙니다. 따라서 셸을 사용해야합니다 ( "함께 연결"하는 작업을 잘 수행함). 이것은 프로그래밍 질문이되며, 가능한 모든 프로그래밍 질문이 StackOverflow에서 답변되었으므로 여기에서 : 어떻게하면 Unix 명령 줄에서 디렉터리 및 하위 디렉터리의 아카이브를 재귀 적으로 압축 해제합니까?

1
Thomas Themel

가장 쉬운 방법은 atool을 사용하는 것입니다 : http://www.nongnu.org/atool/ Zip, unzip, tar, rar 등의 프로그램을 사용하여 아카이브를 추출하는 아주 좋은 스크립트입니다.

사용하다 atool -x package_name.Zip 모두 압축을 풀거나 많은 Zip 파일이있는 디렉토리에서 사용하려면 간단한 for 루프를 사용하십시오.

for f in *; do atool -x $f; fi (사용하기 전에 Zip 파일이있는 원하는 디렉토리로 cd해야합니다).

1
user2648

이 Perl 스크립트는 각 .Zip 파일을 자체 하위 디렉토리로 추출합니다. 중첩 된 Zip 파일을 처리하려면 스크립트를 두 번 이상 실행하십시오. 압축을 푼 후 .Zip 파일을 삭제하지는 않지만 unlink () 호출을 추가하여 변경할 수 있습니다.

#!/usr/bin/Perl -w

# This script unzips all .Zip files it finds in the current directory
# and all subdirectories.  Contents are extracted into a subdirectory
# named after the Zip file (eg. a.Zip is extracted into a/).
# Run the script multiple times until all nested Zip files are
# extracted.  This is public domain software.

use strict;
use Cwd;

sub process_Zip {
    my $file = shift || die;
    (my $dir = $file) =~ s,/[^/]+$,,;
    (my $bare_file = $file);
    $bare_file =~ s,.*/,,;
    my $file_nopath = $bare_file;
    $bare_file =~ s,\.Zip$,,;
    my $old_dir = getcwd();
    chdir($dir) or die "Could not chdir from '$old_dir' to '$dir': $!";
    if (-d $bare_file) {
        chdir($old_dir);
        # assume Zip already extracted
        return;
    }
    mkdir($bare_file);
    chdir($bare_file);
    system("unzip '../$file_nopath'");
    chdir($old_dir);
}

my $cmd = "find . -name '*.Zip'";
open(my $fh, "$cmd |") or die "Error running '$cmd': $!";
while(<$fh>) {
    chomp;
    process_Zip($_);
}
1
John

이 Java 기반 유틸리티 nzip 중첩 된 Zip 파일을 확인하십시오. 중첩 된 zip 파일의 압축을 풀고 압축하는 것은 다음 명령을 사용하여 쉽게 수행 할 수 있습니다.

Java -jar nzip.jar -c list -s readme.Zip

Java -jar nzip.jar -c extract -s "C :\project\readme.Zip"-t readme

Java -jar nzip.jar -c compress -s readme -t "C :\project\readme.Zip"

추신. 나는 저자이며 모든 버그를 신속하게 수정하게되어 기쁩니다.

0
user930412

2010 년부터 Giles와 같은 솔루션이 필요했습니다. 단, 폴더 구조를 유지해야하고 모든 것을 최상위 디렉토리에 압축 해제해야했습니다. 다음은 세 줄이 추가/변경된 그의 의견입니다.

#!/bin/bash
shopt -s globstar nullglob
while set -- **/*.Zip; [ $# -ge 1 ]
do
    for z
    do
        ( cd -- "$(dirname "$z")" &&
            z=${z##*/} &&
            cp -- "$z" "$z".bak &&
            mkdir -- "$z"dir &&
            unzip -- "$z" -d "$z"dir &&
            rm -- "$z"
        )
    done
done
0
steaknchips

Zip 파일 내부의 Zip 파일을 자동으로 압축 해제 할 때주의해야합니다.

http://research.swtch.com/2010/03/Zip-files-all-way-down.html

Zip 파일을 출력으로 생성하는 Zip 파일을 조합하여 출력으로 Zip 파일을 생성하는 등의 작업을 수행 할 수 있습니다. 즉, 프로그램을 "압축 해제"하는 고정 연고 인 Zip 파일을 만들 수 있습니다.

또한 "폭발"할 수있는 Zip 파일을 만드는 사람들을 기억하는 것 같습니다. 이것은 매우 작은 Zip 파일이 수 기가 바이트의 출력으로 압축 해제됩니다. 이것은 압축 방법의 한 측면입니다.

0
Bruce Ediger

아마도 이것이 도움이 될 것입니다 (저를 위해 일했습니다).

function unzipAll(){

# find and count archives
archLst=`find . -type f -name "*.*ar"`
archLstSize=`echo $archLst| awk 'END{print NF}'`

# while archives exists do extract loop
while [ "$archLstSize" -gt 0 ]; do

# extract and remove all archives (found on single iteration)
for x in $archLst; do 
mv "${x}" "${x}_";
unzip "${x}_" -d "${x}" && rm "${x}_"; 
done; #EO for

# find and count archives
archLst=`find . -type f -name "*.*ar"`
archLstSize=`echo $archLst| awk 'END{print NF}'`

done #EO while

}
0
user151061