유닉스에서 디렉토리 압축 풀기 [닫기]

유닉스에서 디렉토리 압축 풀기 [닫기]

unzipUnix에서 폴더를 사용해 보았습니다 .

$ unzip sample.zip

이것은 루트 구조를 생성하는 것입니다 a/b/c/d/e/f/sample.

unzip현재 디렉터리에 폴더가 필요합니다 .

답변1

unzip(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).

답변2

전체 계층 구조 없이 폴더 압축 풀기

폴더가 있는 계층 구조를 유지하지 않고 zip 파일에서 디렉터리 내용의 압축을 풀려고 하면 운이 좋지 않습니다. 이 기능을 제공할 수 있는 방법은 없습니다. 문제는 zip 파일이 생성되는 방식에 있습니다. 그들은 일반적으로 단단한 덩어리로 만들어지기 때문에 대부분의 사람들이 생각하는 것만큼 접근하기 어렵습니다.

내가 본 이 작업을 수행할 수 있는 유일한 두 가지 방법은 다음과 같이 zip 파일 인덱스를 반복하는 루프를 만드는 것입니다.

방법 1

for i in $(unzip -l zipfile.zip); do

   # look for specific location
   # when there, make directory structure you want
   # unzip zipfile.zip $i -d /some/tmp/dir
   # move file from /some/tmp/dir to new directory

done

위 작업은 Perl, Python 등과 같은 다양한 프로그래밍 언어로 완료할 수 있습니다.

방법 #2

또 다른 방법은 zip 파일의 복사본을 만든 다음 도구를 사용하여 zipnote아카이브 내의 파일 색인을 조작한 다음 zip 파일의 색인을 조작한 후 파일을 추출하는 것입니다.

완전한 계층 구조로 폴더 압축 풀기

반면, zip 파일에서 단일 폴더를 추출하려는 경우 다음 명령을 사용할 수 있습니다.

$ unzip "/path/to/archive.zip" "in/archive/folder*" -d "/path/to/unzip/to"

예제 디렉토리 구조.

$ tree 
.
|-- 1
|   |-- 2
|   |   |-- 3
|   |   |   `-- 4
|   |   |       `-- 5
|   |   |           |-- file1
|   |   |           |-- file2
|   |   |           |-- file3
|   |   |           |-- file4
|   |   |           `-- file5
|   |   `-- afile
|   `-- afile
`-- afile

지퍼를 올리세요.

$ zip -r ../afile.zip .
  adding: afile (stored 0%)
  adding: 1/ (stored 0%)
  adding: 1/afile (stored 0%)
  adding: 1/2/ (stored 0%)
  adding: 1/2/afile (stored 0%)
  adding: 1/2/3/ (stored 0%)
  adding: 1/2/3/4/ (stored 0%)
  adding: 1/2/3/4/5/ (stored 0%)
  adding: 1/2/3/4/5/file1 (stored 0%)
  adding: 1/2/3/4/5/file2 (stored 0%)
  adding: 1/2/3/4/5/file3 (stored 0%)
  adding: 1/2/3/4/5/file5 (stored 0%)
  adding: 1/2/3/4/5/file4 (stored 0%)

zip 파일의 내용을 확인합니다.

$ unzip -l ../afile.zip 
Archive:  ../afile.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
        0  11-07-2013 16:43   afile
        0  11-07-2013 16:43   1/
        0  11-07-2013 16:43   1/afile
        0  11-07-2013 16:43   1/2/
        0  11-07-2013 16:43   1/2/afile
        0  11-07-2013 15:51   1/2/3/
        0  11-07-2013 15:51   1/2/3/4/
        0  11-07-2013 15:51   1/2/3/4/5/
        0  11-07-2013 15:51   1/2/3/4/5/file1
        0  11-07-2013 15:51   1/2/3/4/5/file2
        0  11-07-2013 15:51   1/2/3/4/5/file3
        0  11-07-2013 15:51   1/2/3/4/5/file5
        0  11-07-2013 15:51   1/2/3/4/5/file4
---------                     -------
        0                     13 files

이제 폴더 5만 압축을 풉니다.

$ unzip afile.zip "1/2/3/4/5*" -d new/
Archive:  afile.zip
   creating: new/1/2/3/4/5/
 extracting: new/1/2/3/4/5/file1     
 extracting: new/1/2/3/4/5/file2     
 extracting: new/1/2/3/4/5/file3     
 extracting: new/1/2/3/4/5/file5     
 extracting: new/1/2/3/4/5/file4     

감압 확인:

$ tree .
.
`-- 1
    `-- 2
        `-- 3
            `-- 4
                `-- 5
                    |-- file1
                    |-- file2
                    |-- file3
                    |-- file4
                    `-- file5

답변3

아카이브를 임시 위치에 압축을 풀고 파일을 현재 디렉터리로 이동하여 약간 우회적인 방식으로 수행할 수 있지만 이 작업을 직접 수행할 수는 없을 것 같습니다.

이것질문zip 파일 내용의 구조를 실제로 이해하지 못해서 해결하기가 어렵다는 것입니다.정상적인 상황에서. 당신이 원하는 것이 첫 번째 디렉토리 구성 요소를 "쓰레기 처리"하고 그 아래의 모든 것을 현재 디렉토리에 넣는 것이라면 쉘 스크립트나 쉘 함수를 작성하여 이를 수행할 수 있습니다. GNU bash를 사용한 예를 보여드리겠습니다. 다른 쉘을 선호한다면 다른 쉘에 적응하는 것이 어렵지 않을 것입니다. ~/.bashrc 끝에 넣어서 시도해 볼 수 있습니다.

unzip_to_current_dir() {
  zipfilenames="$@"
  for zipfilename in ${zipfilenames}; do
    tempdir=$(mktemp -d)
    unzip -d "${tempdir}" "${zipfilename}"
    mv "${tempdir}/*/*" ./
    rm -rf "${tempdir}"
  done
}

아이디어는 zip 파일 이름을 가져온 다음 임시 디렉터리를 하나씩 만들고 해당 디렉터리에 압축을 풀고 압축이 풀린 대상 디렉터리의 첫 번째 수준 하위 디렉터리에 있는 모든 항목을 현재 디렉터리로 이동한 다음 이동하기 전에 임시 디렉터리를 정리하는 것입니다. 다음 파일로.이렇게 하면 zip 파일에서 경로의 첫 번째 구성 요소가 효과적으로 제거되므로 a/abc, a/bcd, a/cde 및 a/def/ghi가 포함된 zip 파일의 압축을 풀면 이러한 파일이 ./abc, a/bcd, a/cde 및 a/def/ghi./bcd, ./cde 및 ./def/ghi.

이것이 원하는 대로 작동하는지 쉽게 테스트하려면 가장 많이 들여쓴 4개의 줄을 선택하고 한 번에 한 줄씩 수동으로 실행하여 자신의 값만 바꾸십시오 ${zipfilename}. 중요한 데이터가 포함되지 않은 디렉토리에서 이 작업을 수행하는 것이 좋습니다. 스크립트에 데이터 손상 버그가 있는지는 의심스럽습니다. 그러나 손상된 경우 모든 부분을 유지할 수 있습니다.

관련 정보