创建zip文件并忽略目录结构。

325

我需要使用以下命令创建一个zip文件:

zip /dir/to/file/newZip /data/to/zip/data.txt

这行代码可以正常运行,但所创建的zip文件会模仿原始文件所在的目录结构。我不需要这么多多余的文件夹。

我在手册和谷歌搜索中粗略查看并未找到答案。


Unix如何压缩目录但排除特定的子目录?如何在压缩目录时排除文件夹和文件?如何在压缩文件时排除目录?等等。 - jww
2
我曾认为这个问题早于其他所有的堆栈交换,但不幸的是,超级用户的帖子实际上比这个更早。如果有什么我可以在这里做来帮助,请告诉我。这一定是一个非常热门的答案,因为谷歌仍然会带来很多流量到这里。 :D - Jake
7个回答

474

你可以使用-j

-j
--junk-paths
          Store just the name of a saved file (junk the path), and do  not
          store  directory names. By default, zip will store the full path
          (relative to the current directory).

44
如果 -j-r 一起无法在您的目录中使用,请查看这个答案 - czerasz
有时候它就是不起作用...更喜欢@czerasz的链接 ;) 它基本上是一个pushd popd组合。 - TecHunter

65

使用-j选项和-r选项一起不起作用。
因此,解决方法可以是这样:

cd path/to/parent/dir/;
zip -r complete/path/to/name.zip ./* ;
cd -;

或者行内版本

cd path/to/parent/dir/ && zip -r complete/path/to/name.zip ./* && cd -

如果您不想在屏幕上看到cd -的输出,可以将其直接重定向到/dev/null


实际上,您可能想要执行以下操作:cd path/to/parent/dir/ && zip -r ../../../../name.zip ./* && cd - - eddyP23
@eddyP23 这有什么区别吗? 相反,这会导致您为路径中的每个目录添加父级目录(..)的数量 :| - Vikas Tawniya
结果是一样的,我同意。但在许多不同环境中运行的自动化脚本中,通常会避免使用全局路径,因为你不知道全局路径是什么。但是从 cd path/to/parent/dir/ 中,你可以轻松地计算出双点号 ../ 的数量。 - eddyP23
@eddyP23 有道理。 - Vikas Tawniya

38

使用-j选项:

   -j     Store  just the name of a saved file (junk the path), and do not
          store directory names. By default, zip will store the full  path
          (relative to the current path).

20

7

或者,您可以创建一个临时符号链接到您的文件:

ln -s /data/to/zip/data.txt data.txt
zip /dir/to/file/newZip !$
rm !$

这同样适用于目录。


7

保留父目录以避免解压缩时散落文件

当压缩目录时,在存档中保留父目录将有助于避免在以后解压缩存档文件时弄乱当前目录。

因此,为了避免保留所有路径,并且由于您不能同时使用 -j 和 -r(否则将出现错误),您可以执行以下操作:

cd path/to/parent/dir/;
zip -r ../my.zip "../$(basename "$PWD")"
cd -;

""../$(basename "$PWD")"是保留上级目录的魔法。
因此,现在unzip my.zip将会给出一个包含所有文件的文件夹:"
parent-directory
├── file1
├── file2
├── dir1
│   ├── file3
│   ├── file4

与其将未压缩的文件散落在当前目录中:

file1
file2
dir1
├── file3
├── file4

2
然而,在ZIP存档中会创建一个额外的不必要的父目录/../,例如/../parent/sub/ - escalator

5
只需使用-jrm选项即可删除文件和目录结构。
zip -jrm /path/to/file.zip /path/to/file

5
小心,-m --move 将指定文件移动到压缩文件中;实际上,在创建指定的 zip 压缩文件后,它会删除目标目录/文件。如果一个目录在删除文件后变为空,该目录也会被删除。在 zip 无错误地创建存档之前,不会执行任何删除操作。这对于节省磁盘空间很有用,但是潜在风险很高,建议与 -T 结合使用,在删除所有输入文件之前测试存档。 - catalint
1
“-m”标志打开可能会对人们产生巨大影响,甚至可能会引起一些惊吓,或者更糟糕的是,数据丢失(例如,如上评论者所提到的,没有使用“-T”标志)。-1 - SuperJumpBros

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接