初始情况:
.
├── 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 文件?
答案1
您可以使用它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
。为了让这个功能也适用于目录,比如说我们要打包d0
,以及上面例子中的d1
整个目录,这一行会变得稍微复杂一些: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
答案2
您可以手动创建 zip 文件并更新它:
zip myfiles d0
(cd f1; zip -u ../myfiles.zip d1)
(cd f2/f3; zip -u ../../myfiles.zip d4)
括号创建子shell,并且的效果cd
只持续在子shell中,所以不必cd
回到原始目录。
如果d1
、d2
等实际上是文件而不是目录本身,则使用以下-j
选项:
-j
--垃圾路径
仅存储已保存文件的名称(忽略路径),不存储目录名称。默认情况下,zip 将存储完整路径(相对于当前目录)。