如何创建不带子文件夹的多个文件的zip?


12

初始情况:

.
├── d0
├── f0
├── f1
│   └── d1
└── f2
    └── f3
        ├── d2
        ├── d3
        └── d4

我需要做什么:

我想创建一个包含d0,d1和d4的zip文件,该文件必须具有以下结构:

.
├── d0
├── d1
└── d4

我已经尝试过的

我尝试了zip myfiles d0 f1/d1 f2/f3/d4。但这保留了原来的文件夹结构,这不是我想要的。

.
├── d0
├── f1
│   └── d1
└── f2
    └── f3
        └── d4

问题 如何在不包含子文件夹的情况下创建包含多个文件的zip?

Answers:


17

您可以手动创建zip文件并进行更新:

zip myfiles d0
(cd f1; zip -u ../myfiles.zip d1)
(cd f2/f3; zip -u ../../myfiles.zip d4)

括号会创建子shell,并且cd唯一的效果会持续存在于子shell中,因此您不必cd返回到原始目录。

如果d1d2等实际上是文件而不是目录本身,请使用以下-j选项:

-j
--junk-paths
仅存储已保存文件的名称(替换路径),而不存储目录名称。默认情况下,zip将存储完整路径(相对于当前目录)。


19

您可以使用find获取文件列表并执行zip -j myfiles打包操作而忽略路径:

find . -name "d[014]" -exec zip -j myfiles {} +

$ tree
.
├── d0
├── f0
├── f1
│   └── d1
└── f2
    └── f3
        ├── d2
        ├── d3
        └── d4

$ find . -name "d[014]" -exec zip -j myfiles {} +
  adding: d1 (stored 0%)
  adding: d4 (stored 0%)
  adding: d0 (stored 0%)

$ unzip -l myfiles.zip
Archive:  myfiles.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
        0  2017-10-09 10:47   d1
        0  2017-10-09 10:48   d4
        0  2017-10-09 10:47   d0
---------                     -------
        0                     3 files

但是,这仅适用于文件,目录将被忽略zip -j。为了使该功能也适用于目录,请说我们要打包d0d1f3在上例中是整个目录,该find行变得稍微复杂一点:

$ find . \( -name "d[01]" -o -name "f3" \) -exec sh -c 'p=$(pwd); for i in $0 $@; do cd ${i%/*}; zip -ur "$p"/myfiles ${i##*/}; cd "$p"; done' {} +
        zip warning: /home/dessert/myfiles.zip not found or empty
  adding: d1 (stored 0%)
  adding: f3/ (stored 0%)
  adding: f3/d3 (stored 0%)
  adding: f3/d2 (stored 0%)
  adding: f3/d4 (stored 0%)
  adding: d0 (stored 0%)
$ unzip -l myfiles.zip 
Archive:  myfiles.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
        0  2017-10-11 10:18   d1
        0  2017-10-11 10:19   f3/
        0  2017-10-11 10:19   f3/d3
        0  2017-10-11 10:19   f3/d2
        0  2017-10-11 10:19   f3/d4
        0  2017-10-11 10:17   d0
---------                     -------
        0                     6 files

18

使用-j选项将从文件中删除路径。

zip -j myfiles d0 f1/d1 f2/f3/d4 

参考


如果您传递的任何路径不是文件而是目录,则这些目录不会通过选项添加到zip文件中-j
丹·丹

@dan-如果您希望目录中的所有文件都没有路径,那么zip -j myfiles directory/*
ravery 17-10-19
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.