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

到目前为止,我已经有了:

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


这似乎不起作用。

我也尝试过

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


>但是无论如何,仍将在ignoreDir1和ignoreDir2中包含子目录。

我要排除的目录中的子目录结构非常重要,因此我不能简单地将每个目录添加到-x参数中。 br />
有人知道怎么做吗?

评论

@AlexanderMills-看到这个问题。

#1 楼

我离我太近了!

我需要的实际命令是:

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


评论


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

– rynop
2014年12月12日20:44

代替此命令:-x dir1 / ignoreDir1 / ** \ *,您可以这样做:-x dir1 / ignoreDir1 / \ *

–理查德·戈麦斯(Richard Gomes)
16 Jan 22 '14:37



#2 楼

对于我的特定系统来说,要排除目录,我必须在排除的目录两边加上引号,它的作用就像是一种魅力:

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


注释:

-这既排除了要排除的目录,也排除了其中的所有文件。

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

评论


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

–物理吸引力
2015年6月1日,12:55

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

– Zagrimsan
2015年12月1日下午13:57

我认为最初这样做的原因之一是因为在Mac OS上我的目录中有空格,因此避免了\

–探路者
17-10-14在20:08

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

– Synetech
19年6月25日在13:38

相对路径对我有用

– Cazuma Nii Cavalcanti
20年1月6日在16:53

#3 楼

@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

评论


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

–苏尔曼
13-10-30在14:51

#4 楼

以下将执行


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%)


评论


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

–苏尔曼
2012年9月17日上午8:55

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

– ericn
2012年10月31日在7:52

#5 楼

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

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


#6 楼

在Ubuntu Server中,此命令适用于压缩不包括某些文件夹的文件,但有一些区别:
如果要压缩而不保留空文件夹:
zip -r myarchive.zip dir1 -x dir1/ignoreDir1/**\* dir1/ignoreDir2/**\*

如果要压缩,则保留空文件夹:
zip -r myarchive.zip dir1 -x dir1/ignoreDir1\* dir1/ignoreDir2\*

例如:
zip -r testtt.zip uploads/2013/ -x uploads/2013/03/**\* uploads/2013/04/**\*
zip -r testtt.zip uploads/2013/ -x uploads/2013/03\* uploads/2013/04\*


#7 楼

我发现这可以从David R Heffelfinger使用:

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


它排除了目录及其内容。

评论


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

– G-Man说“恢复莫妮卡”
14-10-3在19:48

#8 楼

对我来说有用:zip -9 -r〜/ folded.zip在线-x文件夹/ folder2 / folder3 / foldern / \ *。

似乎星号必须转义。

评论


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

– Zagrimsan
2015年12月1日,13:50

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

–法兰西斯科M
2015年12月15日9:30



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

– Zagrimsan
15年12月15日在10:24