我想排除我正在压缩的父文件夹的所有子目录中的所有 .zip 文件,但不起作用。我检查了页面man zip
,这和这问题,但没有成功。
我努力了:
zip -q -r FILE.zip * -x \*.zip
zip -q -r FILE.zip * -x\*.zip
zip -q -r FILE.zip * -x */\.zip
zip -q -r FILE.zip * -x \*.zip
zip -q -r FILE.zip * -x \*.zip\*
zip -q -r FILE.zip * -x*.zip
并且我仍然包含所有 zip 文件(除了之前使用此命令生成的父文件夹中的文件)。
编辑:问题是文件夹中已经有一个 FILE.zip,其中包含一些 zip 文件。zip
命令更新代替创建如果它尝试创建的文件已经存在,则会创建一个新的压缩文件,即使您未指定 -u 选项。
答案1
您需要引用排除模式,正如您已经尝试过的那样;即使有一个“更好的”解决方案,第一个也应该真正起作用。
但是让我们看一个简化的例子;我创建了一些带有.foo
和.bar
扩展名的文件的目录:
在这里我运行find
列出我的测试目录 - 它显示所有文件和目录:
$ find
.
./1.bar
./1.foo
./sub1
./sub1/sub2
./sub1/sub2/1.bar
./sub1/sub2/1.foo
./sub1/1.foo
./sub1/1.bar
现在,我们只能看到什么是有效的
(我们将输出文件放在一边,它与匹配无关)。
打包所有文件:
$ zip -r /tmp/out.zip *
adding: 1.bar (stored 0%)
adding: 1.foo (stored 0%)
adding: sub1/ (stored 0%)
adding: sub1/sub2/ (stored 0%)
adding: sub1/sub2/1.bar (stored 0%)
adding: sub1/sub2/1.foo (stored 0%)
adding: sub1/1.foo (stored 0%)
adding: sub1/1.bar (stored 0%)
不包括文件的打包.foo
:
$ rm /tmp/out.zip
$ zip -r /tmp/out.zip * -x '*.foo'
adding: 1.bar (stored 0%)
adding: sub1/ (stored 0%)
adding: sub1/sub2/ (stored 0%)
adding: sub1/sub2/1.bar (stored 0%)
adding: sub1/1.bar (stored 0%)
成功了!
用你的第一个模式再试一次:
$ rm /tmp/out.zip
$ zip -r /tmp/out.zip * -x \*.foo
adding: 1.bar (stored 0%)
adding: sub1/ (stored 0%)
adding: sub1/sub2/ (stored 0%)
adding: sub1/sub2/1.bar (stored 0%)
adding: sub1/1.bar (stored 0%)
也有效!
所以...仔细看看你在那里真正做了什么。
首先,您可以删除-q
“安静”选项,隐藏我的示例中显示的标准消息。
下一步,添加-v
“详细”选项,以查看更多详细信息 - 可能太多了,但也许您可以发现一些有趣的东西。
从评论中我看到删除-q
已经有帮助的;
根本问题是,用于测试的 zip 命令因输出文件的存在而被修改。
从技术上讲,它甚至修改了自身……
从man zip
:
Command format. The basic command format is
zip options archive inpath inpath ...
where archive is a new or existing zip archive and inpath is a directory or
file path optionally including wildcards. When given the name of an exist‐
ing zip archive, zip will replace identically named entries in the zip ar‐
chive (matching the relative names as stored in the archive) or add entries
for new names.