Unix zip目录,但排除特定的子目录(及其中的所有内容)


114

我正在尝试压缩目录(在Unix上通过SSH),但是我需要排除几个子目录(以及其中的所有文件和目录)。

到目前为止,我有这个:

zip -r myarchive.zip dir1 -x dir1/ignoreDir/**/* 

但这似乎不起作用。

我也试过

zip -r myarchive.zip dir1 -x dir1/ignoreDir1/* dir1/ignoreDir2/*

但是,该操作仍将在ignoreDir1和ignoreDir2中包含子目录。

我要排除的目录中的子目录结构非常重要,因此我不能简单地将每个目录添加到-x参数中。

有谁知道如何做到这一点?


@AlexanderMills-看到这个问题。
jww

Answers:


130

我好近!

我需要的实际命令是:

zip -r myarchive.zip dir1 -x dir1/ignoreDir1/**\* dir1/ignoreDir2/**\*

很酷,感谢您的跟进!顺便说一句,您可以接受自己的答案。
Daniel

2
这对我在osx上不起作用。@pathfilder的回答虽然。
rynop 2014年

11
代替此:-x dir1 / ignoreDir1 / ** \ *,您可以这样做:-x dir1 / ignoreDir1 / \ *
Richard Gomes

67

对于我的特定系统,为了排除目录,我必须在排除的目录周围加上引号,并且它的工作原理很吸引人:

zip -r myarchive.zip dir1 -x "dir1/ignoreDir1/*" "dir1/ignoreDir2/*"

笔记:

-这不仅排除了要排除的目录,而且排除了其中的所有文件。

-您必须使用要排除的目录的完整路径!


5
这是可在Mac OS上使用的软件。:-)
物理

9
正如没有人解释需要引用路径或转义星号的原因一样,原因是:如果未引用路径或通配符已转义,则Shell将在将通配符传递到之前执行通配符扩展zip,它将接收到列表。指定目录中条目的路径,而不是这些文件的子目录中文件的路径,因此zip不会忽略给定目录下的所有内容。
zagrimsan 2015年

我认为最初这样做的原因之一是因为在Mac OS上我的目录中有空格,并且避免了\
路径查找器17/10/14

感谢您清理@zagrimsan。这既解决了问题,解释了原因,以便我们理解(将来在其他方面也将派上用场)。👍
Synetech

7

以下将做

zip -r myarchive.zip dir1 -x dir1 / ignoreDir1 \ * dir1 / ignoreDir2 \ *

你需要什么**,@ sulman?

它对我来说就像是一种魅力,如下所示:

[root@ip-00-000-000-000 dir1]# ls -lrt dir1/ 
total 16
drwxr-xr-x 2 root root 4096 Oct 31 07:38 ignoredir1
drwxr-xr-x 2 root root 4096 Oct 31 07:38 ignoredir2
drwxr-xr-x 2 root root 4096 Oct 31 07:39 dir3
-rw-r--r-- 1 root root    8 Oct 31 07:39 test.txt

[root@ip-00-000-000-000 temp]# zip -r dir1.zip dir1 -x dir1/ignoredir1\* dir1/ignoredir2\*
  adding: dir1/ (stored 0%)
  adding: dir1/dir3/ (stored 0%)
  adding: dir1/dir3/test3.txt (deflated 13%)
  adding: dir1/test.txt (stored 0%)

我不知道为什么需要**。也许其他人可以对此有所了解?
sulman 2012年

抱歉,@ sulman,我打错了。我的意思是根据我的最新编辑。对我来说就像是一种魅力:)
ericn

7

@sulman使用:

     zip -r myarchive.zip dir1 -x dir1 / ignoreDir1 / ** \ * dir1 / ignoreDir2 / ** \ *

仍将使用压缩文件在zip归档文件中包含dir1 / ignoreDir1 /空文件夹。

     zip -r myarchive.zip dir1 -x dir1 / ignoreDir1 ** dir1 / ignoreDir2 **

可以解决问题,您也可以使用前导**在子文件夹中进行搜索,而不仅仅是dir1


喔好吧!感谢您对此发表看法!
sulman 2013年

1

与其他答案一样,但完全排除目录,而不是排除目录的所有内容:

zip -r myarchive.zip dir1 -x dir1/ignoreDir1/\* dir1/ignoreDir2/\*

0

我发现这是David R Heffelfinger的作品

zip -r myarchive.zip dir1 -x dir1/ignoreDir1\* dir1\ignorDir2\*

它排除了目录及其内容。


dir1和之间的反斜杠肯定ignorDir2是正斜杠。您是说其他反斜杠是反斜杠吗?如果这样做,那么您刚刚复制了两年前Fuzzybee的答案。
G-曼

-1

对于我来说工作过: zip -9 -r〜/ folded.zip在线-x folder / folder2 / folder3 / foldern / \ *

似乎必须将星号转义。


2
这与一年前的Rick Ehrahrt或Eric(几年前)的解决方案有何不同?在发布新解决方案之前,请
务必

因为我在星号之前添加了一个反斜杠(即逃避星号)。如果我不这样做,在Linux版本中,我的工作将无法正常工作。
Francisco M

Rick Ehrahrt(2014)和eric(2012)也发布了相同的解决方案(以避开星号)。解决方案没有错,但是多次发布相同的解决方案是没有道理的,除非人们可以通过解释解决方案为何有效地大大增加解决方案的深度。在这样的简单情况下,没有更多的解释。请不要以个人为中心,我在这里的唯一意图是帮助保持SU简洁明了,以便用户以最少的努力找到最佳的解决方案。
zagrimsan 2015年
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.