題 Unix zip目錄但排除了特定的子目錄(以及其中的所有內容)


我正在嘗試壓縮目錄(在Unix上通過SSH),但我需要排除幾個子目錄(以及其中的所有文件和目錄)。

到目前為止我有這個:

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

但這似乎不起作用。

我也試過了

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

但是,它仍將包含ignoreDir1和ignoreDir2中的子目錄。

我想要排除的目錄中的子目錄結構相當大,所以我不能簡單地將每個目錄添加到-x參數中。

有誰知道如何做到這一點?


85
2017-07-19 10:19


起源


@AlexanderMills - 看到這個問題。 - jww


答案:


我太近了!

我需要的實際命令是:

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

92
2017-07-19 10:32



很酷,謝謝你的跟進!順便說一句,你可以接受自己的答案。 - Daniel H
正是我在尋找,謝謝老兄! - Latheesan
這在osx上對我不起作用。雖然@pathfilder回答了。 - rynop
而不是:-x dir1 / ignoreDir1 / ** \ *,你可以這樣做:-x dir1 / ignoreDir1 / \ * - Richard Gomes


對於我的特定係統,為了排除目錄,我必須在我的排除目錄周圍加上引號,它就像一個魅力:

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

筆記:

- 這排除了要排除的目錄和其中的所有文件。

- 您必須使用要排除的目錄的完整路徑!


55
2017-10-31 11:43



這是適用於Mac OS的。 :-) - physicalattraction
由於沒有人解釋要求引用路徑或轉義星號的原因,原因是:如果路徑未引用或通配符轉義,則shell將執行通配符擴展 之前 傳遞給他們 zip,它將接收指定目錄中條目的路徑列表,但不接收那些子目錄中文件的路徑,從而導致 zip 不要忽略給定目錄下的所有內容。 - zagrimsan
我認為最初的原因之一是因為在Mac OS上我的目錄中有空格,這避免了需要一個\ - pathfinder


以下將做

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

你需要什麼? ** 為了,@蘇爾曼?

它對我來說就像一個魅力如下:

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

6
2017-09-17 05:00



我不知道為什麼需要**。也許其他人可以對此有所了解? - sulman
對不起,@蘇爾曼,我打錯了。根據我最新的編輯,我的意思是什麼。像我一樣的魅力:) - ericn


@sulman使用:

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

將仍然在zip存檔中包含dir1 / ignoreDir1 / empty文件夾,使用:

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

會做的伎倆,你也可以使用前導**來搜索子文件夾而不是只搜索dir1


4
2017-10-30 11:31



喔好吧!謝謝你們對此有所了解! - sulman


就像其他答案一樣,但完全排除目錄,而不是排除目錄的所有內容:

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

1
2018-01-22 14:39





我發現這可以起作用 David R Heffelfinger

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

它排除了目錄及其內容。


0
2017-10-03 18:28



當然是兩者之間的反斜杠 dir1 和 ignorDir2 意味著是一個正斜線。你的意思是其他反斜杠是反斜杠嗎?如果你這樣做,那麼你剛剛複制了兩年前的fuzzybee答案。 - G-Man


對我來說工作:  zip -9 -r~ / folded.zip online -x folder / folder2 / folder3 / foldern /\ *

似乎必須轉義星號。


-1
2017-12-01 13:29



這與一年前Rick Ehrahrt或Eric(幾年前)的解決方案有什麼不同?請在發布新解決方案之前閱讀提供的解決方案...... - zagrimsan
因為我在星號之前添加了反斜杠(即逃避星號)。在我的工作的Linux版本,如果我不這樣做不起作用。 - Francisco M
Rick Ehrahrt(2014)和eric(2012)也發布了相同的解決方案(以避開星號)。該解決方案沒有任何問題,但多次發布相同的解決方案沒有意義,除非通過解釋解決方案的工作原理,可以顯著增加解決方案的深度。在這樣的簡單案例中,沒有什麼可以解釋的。請不要個性化,我的唯一目的是幫助保持SU清潔和簡潔,以便用戶能夠以最少的努力找到最佳解決方案。 - zagrimsan