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

Posted

技术标签:

【中文标题】创建 zip 文件并忽略目录结构【英文标题】:Create zip file and ignore directory structure 【发布时间】:2012-03-31 09:28:47 【问题描述】:

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

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

这可行,但创建的 zip 文件会创建一个目录结构,该目录结构模仿原始文件的目录。这是很多我不需要的额外文件夹。

粗略浏览一下手册页或 Google 搜索,我都没有找到答案。

【问题讨论】:

Unix zip directory but excluded specific subdirectories、how to exclude directories and file zipping a directory?、How to exclude a directory when zipping files等 我认为这个问题早于所有其他堆栈交换,但唉,超级用户的帖子实际上比这个更早。如果有什么我可以在这里帮助的,请告诉我。这一定是一个非常热门的答案,因为谷歌仍然在这里带来如此多的流量。 :D 【参考方案1】:

您可以使用-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).

【讨论】:

如果-j 不适用于您的目录(连同-r)结帐this answer 有时它只是不起作用......更喜欢@czerasz链接;)这基本上是一个pushd popd组合【参考方案2】:

-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 它有什么不同?相反,它会导致您添加否。路径中每个目录的 parentDir(..) :| 结果是一样的,我同意。但是在许多不同环境中运行的自动化脚本中,您通常会避免使用全局路径,因为您不知道全局路径将是什么。但是从cd path/to/parent/dir/你可以很容易地计算出../的双点数。 @eddyP23 有意义【参考方案3】:

使用-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).

【讨论】:

【参考方案4】:

有点相关 - 我正在寻找一种对目录执行相同操作的解决方案。 不幸的是,-j 选项不适用于此:(

这里有一个很好的解决方案来说明如何完成它: https://superuser.com/questions/119649/avoid-unwanted-path-in-zip-file

【讨论】:

【参考方案5】:

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

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

这也适用于目录。

【讨论】:

【参考方案6】:

保留父目录,这样unzip 就不会到处乱扔文件

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

因此,为了避免保留所有路径,并且由于您不能同时使用 -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

【讨论】:

但是在 ZIP 存档中创建了一个额外的不需要的父目录 /../,例如 /../parent/sub/【参考方案7】:

只需使用-jrm 选项删除文件和目录 结构

zip -jrm /path/to/file.zip /path/to/file

【讨论】:

小心, -m --move 将指定文件移动到zip存档中;实际上,这会在制作指定的 zip 存档后删除目标目录/文件。如果删除文件后目录变为空,则该目录也将被删除。在 zip 无错误地创建存档之前,不会进行任何删除。这对于节省磁盘空间很有用,但存在潜在危险,因此建议在删除所有输入文件之前将其与 -T 结合使用以测试存档。

以上是关于创建 zip 文件并忽略目录结构的主要内容,如果未能解决你的问题,请参考以下文章

java.util.zip - 重新创建目录结构

将zip内容提取到与zip文件同名的目录中,保留目录结构[关闭]

使用Ansible的主机备用目录布局时如何忽略文件?

Python:将文件解压缩到当前工作目录,但不在 zip 中维护目录结构

基于固定相对路径在 zip 文件中包含目录结构

技术分享 | Golang 1.9源码目录结构