압축 해제를 사용하여 디렉토리의 일부를 가비지로 바꾸시겠습니까?

압축 해제를 사용하여 디렉토리의 일부를 가비지로 바꾸시겠습니까?

zip 파일에는 f.zip디렉터리가 포함된 여러 파일이 포함되어 있습니다.

 A/B
 A/B/C
 A/B/C/D

 ..
 A/B/C/D/and/some/more/dirs
 A/B2

이제 나는 C/D 아래의 트리에만 관심이 있습니다. A/B/C를 포함하여 D 아래의 모든 항목(D가 유일한 시퀀스라고 가정)을 현재 디렉터리로 추출 할 수 있지만 unzip f.zip */D/* -d .D가 압축 해제 작업의 루트 디렉터리가 되기를 원합니다. 물론 D를 현재 작업 디렉터리로 이동할 수 있지만 이는 부정행위라고 생각합니다.

매뉴얼 페이지나 Google 모두 해결책을 공개하지 않지만 어쩌면 제가 간과하고 있는 것일 수도 있고 옮기는 것보다 더 나은 해결책이 있을 수도 있습니다.

아, 내 플랫폼은 mac os x 10.8.prettyup2date입니다.

답변1

매뉴얼 페이지의 압축을 풀면:

   -j     junk paths.  The archive's directory structure is not recreated;
     all files are deposited in the extraction directory (by default,
     the current one).

그래서:

unzip -d D -j f.zip */D/*

디렉터리 구조 없이 D라는 폴더에 모두 추출합니다(이렇게 하면 D 하위 디렉터리의 파일이 최상위 출력 D 폴더로 추출됩니다).

편집하다OP는 D 폴더 아래에 파일 구조를 유지하려고 합니다.

unzip -l f.zip | grep 'A/B/C/D' | \
perl -ple 's/\s+\d+\s+\d{4}-\d{2}-\d{2}\s+\d{2}:\d{2}\s+(.*)$/$1/' | \
while read file
do 
    unzip -j -d "$(echo $file | sed 's:A/B/C/\(.*\)/.*:\1:g')" f.zip "$file"
done

각 단계의 부품:

unzip -l f.zip

f.zip으로 파일 목록 가져오기

grep 'A/B/C/D'

grep은 대상 디렉토리의 파일 행을 표시합니다.

perl -ple 's/\s+\d+\s+\d{4}-\d{2}-\d{2}\s+\d{2}:\d{2}\s+(.*)$/$1/'

Perl을 사용하여 일치하는 줄에서 파일 이름을 가져옵니다(내 sed-fu는 Stephane의 것만큼 좋지 않으므로 Perl을 사용하겠습니다!).파일 이름의 공백을 처리합니다.:)

while read file
do

위 명령으로 생성된 파일을 반복하여 다음에 할당합니다.$file

unzip -j -d "$(echo $file | sed 's:A/B/C/\(.*\)/.*:\1:g')" f.zip "$file" 

대상 $file경로를 버리고 대상 디렉터리에 압축을 푼다.

echo $file | sed 's:A/B/C/\(.*\)/.*:\1:g'

파일 이름에서 선행 A/B/C/ 경로를 제거합니다. $()(a, 자세한 내용은 bash 참조)로 묶여 있으며 Command substitution명령 대체는 공백을 보존하고 실제로 평가하기 위해 큰따옴표 안에 있습니다 $(). .

done

사이클을 완료하십시오.

이는 실제로 A/B/C와 일치하는 모든 파일에 대해 압축 해제 작업을 실행합니다.

unzip -j -d "D" f.zip "A/B/C/D/"
unzip -j -d "D" f.zip "A/B/C/D/b"
unzip -j -d "D" f.zip "A/B/C/D/e"
unzip -j -d "D/stupid space" f.zip "A/B/C/D/stupid space/"
unzip -j -d "D/stupid space" f.zip "A/B/C/D/stupid space/b"
unzip -j -d "D/stupid space" f.zip "A/B/C/D/stupid space/e"
unzip -j -d "D/stupid space" f.zip "A/B/C/D/stupid space/d"
unzip -j -d "D/stupid space" f.zip "A/B/C/D/stupid space/c"
unzip -j -d "D/stupid space" f.zip "A/B/C/D/stupid space/a"
unzip -j -d "D" f.zip "A/B/C/D/d"
unzip -j -d "D" f.zip "A/B/C/D/f"

이 명령을 실행하여 기존 파일 구조로 추출하는 경우 기존 파일 -o에 추가 콘텐츠를 추가해야 합니다 override(또는 파일을 파괴하는 첫 번째 압축 풀기 작업에서 메시지가 표시되고 replace D/b? [y]es, [n]o, [A]ll, [N]one, [r]ename: extracting: D/b폭발합니다). 해당 힌트가 필요한 경우 읽기 및 읽기를 사용하지 않는 다른 루프 방법을 사용해야 합니다.반품공백을 처리합니다( for $( ... )테스트가 실패하게 됩니다). 만약 당신이 이것을 해야 한다면, 나는 그것을 당신이 알아낼 수 있도록 연습으로 남겨두겠습니다!

답변2

zip을 디렉터리로 마운트합니다. 당신은 이것을 할 수 있습니다퓨즈, 커널 드라이버가 아닌 일반 프로그램으로 구현되는 파일 시스템 드라이버를 위한 일반 프레임워크입니다. 설치하다OSX 퓨즈(OSX에서 Universal FUSE 지원)퓨즈 지퍼(zip 아카이브용 FUSE 드라이버). 필요한 소프트웨어를 설치한 후 아카이브를 설치하십시오.

mkdir /tmp/myzip
fuse-zip f.zip /tmp/myzip

이제 디렉토리처럼 zip에 있는 파일에 액세스할 수 있습니다. 을 추출하려면 A/B/C/D복사하세요.

cp -Rp /tmp/myzip/A/B/C/D /some/where

완료되면 지퍼를 제거하세요.

fusermount -u /tmp/myzip
rmdir /tmp/myzip

미리 설치된 소프트웨어를 건너 뛰려면 압축을 풀고 A/B/C/D디렉터리를 이동해야 할 것 같습니다.

관련 정보