如何创建包含多个文件而没有子文件夹的 zip?

eDe*_*ser 13 command-line zip

初始情况:

.
??? d0
??? f0
??? f1
?   ??? d1
??? f2
    ??? f3
        ??? d2
        ??? d3
        ??? d4
Run Code Online (Sandbox Code Playgroud)

我需要做什么:

我想创建一个包含 d0、d1 和 d4 的 zip,它们必须具有休闲结构:

.
??? d0
??? d1
??? d4
Run Code Online (Sandbox Code Playgroud)

我已经尝试过的:

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

.
??? d0
??? f1
?   ??? d1
??? f2
    ??? f3
        ??? d4
Run Code Online (Sandbox Code Playgroud)

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

des*_*ert 20

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

find . -name "d[014]" -exec zip -j myfiles {} +
Run Code Online (Sandbox Code Playgroud)

例子

$ 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
Run Code Online (Sandbox Code Playgroud)

然而,这仅适用于文件,目录将被zip -j. 为了让这也适用于目录,假设我们想要 pack d0d1并且f3在上面的示例中整个目录,该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
Run Code Online (Sandbox Code Playgroud)


mur*_*uru 18

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

zip myfiles d0
(cd f1; zip -u ../myfiles.zip d1)
(cd f2/f3; zip -u ../../myfiles.zip d4)
Run Code Online (Sandbox Code Playgroud)

括号创建子shell,并且cd只在子shell中的效果持续,所以你不必cd回到原来的目录。

如果d1,d2等实际上是文件而不是目录本身,则使用该-j选项:

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


rav*_*ery 18

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

zip -j myfiles d0 f1/d1 f2/f3/d4 
Run Code Online (Sandbox Code Playgroud)

参考