如何将文件压缩为文件夹

如何将文件压缩为文件夹

我的文件结构与此类似:

- 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似乎不可能与常用的实用程序。

作为解决方法,您可以使用硬链接在临时文件夹中创建所需的目录结构。

(我不知道为什么人们会提到targzip。它们不相关,因为你明确指出你想要zip文件。)

答案3

您可以使用 libarchivebsdtar及其-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

相关内容