我的文件结构与此类似:
- 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
您可以使用 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