파일을 폴더로 압축하는 방법

파일을 폴더로 압축하는 방법

내 파일 구조는 다음과 유사합니다.

- root_folder_with_bad_name
  - file1
  - file2
  - file3

다음 구조의 zip 아카이브를 가져와야 합니다.

- archive.zip
  - some_folder
    - file1
    - file2
    - file3

파일의 root_folder 이름을 모르므로 이 작업을 수행할 수 없습니다.

zip archive.zip some_root_folder_name

이 폴더 안의 파일을 압축할 수 있기를 원합니다. 어떻게 해야 하나요?

답변1

대상 보관 폴더 이름을 사용하여 임시 디렉터리 계층을 생성하고 압축한 후 삭제할 수 있습니다.

이는 현재 디렉터리에 bash명명된 디렉터리(또는 파일)가 없다고 가정하여 작동합니다.archive

(
    shopt -s extglob
    mkdir archive &&
        cp -al !(archive) archive &&
        zip -r archive.zip archive
    rm -rf archive
)

새 디렉터리 계층 구조는 복사되지 않고 연결되므로 (a) 속도가 빠르고 (b) 상당한 추가 디스크 공간을 차지하지 않습니다.

실제 사례

# Set up the files in a directory
mkdir secret_name; touch secret_name/file{1,2,3}
cd secret_name/

# Now create the archive
( shopt -s extglob; mkdir archive && cp -al !(archive) archive/ && zip -r archive.zip archive; rm -rf archive )

# List the archive
unzip -l archive.zip

Archive:  archive.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
        0  2020-10-16 19:21   archive/
        0  2020-10-16 19:12   archive/file2
        0  2020-10-16 19:12   archive/file3
        0  2020-10-16 19:12   archive/file1
---------                     -------
        0                     4 files

답변2

zip원본 파일과 이름이나 경로가 다른 아카이브 에 파일을 저장하려는 것 같습니다 . 경로를 완전히 제거하는 것 외에도파일의 경로나 파일명을 수정하는 zip것은 불가능해 보입니다.일반적으로 사용되는 유틸리티를 사용합니다.

해결 방법으로 하드 링크를 사용하여 임시 폴더에 원하는 디렉터리 구조를 만들 수 있습니다.

tar(사람들이 왜 . 및 을 언급하는지 모르겠습니다 gzip. 귀하가 파일을 원한다고 명시적으로 밝혔기 때문에 관련이 없습니다 zip.)

답변3

libarchive bsdtar및 해당 -s옵션을 사용하여 아카이브에 추가된 파일의 경로를 편집할 수 있습니다.

$ ls
file1  file2  file3
$ bsdtar --format=zip -'s|^\.|some_folder|' -cf ../file.zip .
$ unzip -l ../file.zip
Archive:  ../file.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
        0  2020-10-16 21:15   some_folder/
        0  2020-10-16 21:15   some_folder/file1
        0  2020-10-16 21:15   some_folder/file3
        0  2020-10-16 21:15   some_folder/file2
---------                     -------
        0                     4 files

답변4

또한 이것은 파일을 복사하지 않고 심볼릭 링크를 사용하여 작동하는 것 같습니다.

> ls old_parent/
file1  file2

> ln -s old_parent new_parent

> zip -r archive.zip new_parent
  adding: new_parent/ (stored 0%)
  adding: new_parent/file2 (deflated 22%)
  adding: new_parent/file1 (deflated 38%)

> unzip -l archive.zip 
Archive:  archive.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
        0  2020-10-16 22:48   new_parent/
       50  2020-10-14 08:18   new_parent/file2
      348  2020-10-16 13:58   new_parent/file1
---------                     -------
      398                     3 files

> rm new_parent

관련 정보