최상위 디렉토리를 만들지 않고 특정 디렉토리 압축 해제


12

모든 파일이 저장되는 최상위 디렉토리가있는 ZIP 파일이 있습니다.

Release/
Release/file
Release/subdirectory/file
Release/subdirectory/file2
Release/subdirectory/file3

Release디렉토리 구조를 유지하면서에서 모든 것을 추출하고 싶지만 이것을 실행할 때 :

unzip archive.zip Release/* -d /tmp

최상위 Release폴더를 만듭니다 .

/tmp/Release/
/tmp/Release/file
/tmp/Release/subdirectory/file
/tmp/Release/subdirectory/file2
/tmp/Release/subdirectory/file3

폴더 Release 만들지 않고 내부에서 모든 것을 추출하는 방법 Release은 다음과 같습니다.

/tmp/
/tmp/file
/tmp/subdirectory/file
/tmp/subdirectory/file2
/tmp/subdirectory/file3

이것을 시도unzip archive.zip && mv Release/* .
조지 우도 센

@George 이것은 여전히 Release폴더를 만듭니다
jsta

답변:


5

귀하의 경우 대상 폴더에서 시도하십시오.

ln -s Release . && unzip <YourArchive>.zip

작성한 링크를 제거해야하는 것보다 :

rm Release

3

j플래그는 폴더 생성을 방지한다unzip -j archive.zip -d .

로부터 man 페이지 :

-j 

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

9
나는 이것이 가깝다고 생각하지만 OP는 최상위 디렉토리의 생성을 건너 뛰고 나머지 디렉토리 구조를 보존하려고했습니다. 이 -j옵션은 아카이브의 디렉토리 구조에 관계없이 모든 파일을 현재 디렉토리로 덤프합니다.
Charles Green

1

추출 된 트리를 평탄화하기위한 Python 스크립트

다음 스크립트는 zip 파일을 추출하여 최상위 디렉토리에 포함 된 파일을 현재 작업 디렉토리로 이동시킵니다. 이 빠른 스크립트는 모든 파일을 포함하는 하나의 최상위 디렉토리가 하나만있는 경우이 특정 질문에 적합하도록 조정되어 있지만보다 일반적인 경우에 약간의 편집 작업을 수행 할 수 있습니다.

#!/usr/bin/env python3
import sys
import os
from zipfile import PyZipFile
for zip_file in sys.argv[1:]:
    pzf = PyZipFile(zip_file)
    namelist=pzf.namelist()
    top_dir = namelist[0]
    pzf.extractall(members=namelist[1:])
    for item in namelist[1:]:
        rename_args = [item,os.path.basename(item)]
        print(rename_args)
        os.rename(*rename_args)
    os.rmdir(top_dir)

시운전

다음은 스크립트가 작동하는 방식의 예입니다. 모든 것이 현재 작업 디렉토리로 추출되었지만 소스 파일은 전혀 다른 디렉토리에있을 수 있습니다. 테스트는 내 개인 github 저장소의 zip 아카이브에서 수행됩니다.

$ ls                                                                                   
flatten_zip.py*  master.zip
$ ./flatten_zip.py master.zip                                                          
['utc-time-indicator-master/.gitignore', '.gitignore']
['utc-time-indicator-master/LICENSE', 'LICENSE']
['utc-time-indicator-master/utc-time-indicator', 'utc-time-indicator']
['utc-time-indicator-master/utc_indicator.png', 'utc_indicator.png']
$ ls
flatten_zip.py*  LICENSE  master.zip  utc_indicator.png  utc-time-indicator

다른 위치에있는 소스 파일로 테스트

$ mkdir test_unzip
$ cd test_unzip
$ ../flatten_zip.py  ../master.zip                                                     
['utc-time-indicator-master/.gitignore', '.gitignore']
['utc-time-indicator-master/LICENSE', 'LICENSE']
['utc-time-indicator-master/utc-time-indicator', 'utc-time-indicator']
['utc-time-indicator-master/utc_indicator.png', 'utc_indicator.png']
$ ls
LICENSE  utc_indicator.png  utc-time-indicator
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.