排除目录和文件的Zip命令

8

我正在尝试在CentOS 5中使用此SSH命令压缩一个充满文件夹和文件的目录,但排除下面的示例。但是它并没有起作用。

zip -r file.zip * -x dir1 -x dir2 -x file1 -x file2

或者这一个

zip -r file.zip * -x "dir1" -x "dir2" -x "file1" -x "file2"

它仍然只会压缩整个目录以及其中的所有内容。我不想要dir1 dir2 file1 file2。

我需要知道正确的-x语法来使排除函数起作用。


1
是的,这是一个关于SSH脚本的编程问题。 - sven30
Stack Overflow是一个关于编程和开发问题的网站。这个问题似乎不属于编程或开发范畴。请参阅帮助中心中的我可以在这里问什么样的问题。也许超级用户Unix&Linux Stack Exchange更适合提问。 - jww
Unix压缩目录但排除特定子目录,如何在打包目录时排除目录和文件夹?如何在压缩文件时排除目录?等。 - jww
5个回答

17
对于我的特定系统,为了排除一个目录,我不得不在排除的目录周围加上引号,这样就能完美地工作了。
zip -r myarchive.zip target -x "target/exclude1/*" "target/exclude2/*"

注意事项:
- 这将排除要排除的目录及其内部的所有文件。
- 您必须使用要包含和排除的目录的完整路径!
- 只要排除项位于行末尾,您就不需要使用@符号。

这是唯一对我有效的答案! - supersan

9

-x选项有点奇怪;您需要按照文件列表的顺序,以-x开头,以@符号结尾:

   zip file.zip -r * -x dir1 dir2 file1 file2 @

我也严重怀疑你想在Unix系统中的文件名中使用\,请确保你的路径正确。通常情况下,/是路径分隔符。
例如:
mkdir tmp5
cd tmp5
touch a b c d e f g
zip foo.zip -r * -x e f g @
  adding: a (stored 0%)
  adding: b (stored 0%)
  adding: c (stored 0%)
  adding: d (stored 0%)

通过使用子目录,您可以轻松地使用通配符省略它们的内容,但看起来 * 导致包含目录本身(为空):
mkdir x y z
touch {a,b,c} {x,y,z}/{a,b,c}
zip foo.zip -r * -x c y y/* z z/* @
  adding: a (stored 0%)
  adding: b (stored 0%)
  adding: x/ (stored 0%)
  adding: x/b (stored 0%)
  adding: x/a (stored 0%)
  adding: x/c (stored 0%)
  adding: y/ (stored 0%)
  adding: z/ (stored 0%)

您最好省略*,并明确列出您想要包含的内容...
zip core-latest-$version.zip -r cp images include mobile stats \
    -x cp/includes/configure.php @

(在结尾处的 \ 只是继续到下一行;您可以将其全部放在一行上,而不需要尾随的 \


这是我的脚本: echo -n "输入新版本(v1-1)" read version cd /home/core/www/ rm -rf core-latest-*.zip zip core-latest-$version.zip -r * -x templates stats cp/includes/configure.php @ chown -R core.core core-latest-$version.zip - sven30
这只是更常见的做法,因此您的ZIP文件包含一个顶级文件夹。并不是“错误”的,只是不太寻常。看起来不错,并且似乎对我有效。 - BRPocock
你的意思是压缩 www 目录吗?这是为了安装 PHP 程序到其他服务器进行下载,然后他们可以将其放入他们的 www 或 public_html 目录并解压缩即可。 - sven30
如果模板和统计目录中有内容,这会有影响吗?我希望将其全部排除,包括文件夹及其内容。 - sven30
啊,你没有提到随机文件——它们不在你给出的清单中;你可以列举它们,使用-x dir/* @来剥离你不想压缩的目录,或者……如果你的应用程序用100个文件杂乱地放置在根目录下,也许是时候对代码库进行清理,使之不那么混乱了? :-) 一个小技巧:如果你的文件名有点而目录没有,你可以在包含列表中添加*.*。与DOS/Windows不同,这只会包括具有字面上的 . 在其名称中的文件,因此会跳过没有它的文件/目录(如templates)。 - BRPocock
显示剩余4条评论

0
在我有限的使用zip命令的经验中,似乎-x选项希望对文件的完整路径进行模式匹配。所以,如果你想要排除dir1 dir2目录中的所有内容和名为file1 file2的任何文件,可以尝试像这样的方法:
zip -r file.zip * -x 'dir1/*' 'dir2/*' '*/file1' '*/file2'

你之前的方式只会排除根目录下与这些名称完全匹配的文件和目录。


0
如果您正在使用putty,请按照以下步骤操作:
  1. 进入您的目录:$ cd 目录名称,然后按回车键
  2. 输入以下命令:

    $ zip -r 文件名.zip . -x \*排除文件夹名称\*
    

zip 命令中使用 . 表示当前目录,* 表示通配符。


0

简而言之;

使用 -x "**/folder/*"

详细解释;

你可以使用与 gitignore 或 vscode 排除文件相同的语法 vscode 文件排除语法


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接