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
디렉터리를 이동해야 할 것 같습니다.