2013-10-29 40 views
6

嗨,我必須解壓縮一個文件,可能有一個目錄,我想排除該目錄中的所有內容,我嘗試了很多選項,並且看起來也是這樣,但似乎沒有找到任何好的解決方案。linux unzip排除文件夾中和下面的所有內容

這些都是zip文件的內容: 請注意排除文件夾是未知的深度,但我們必須排除一切

$unzip -l patch2.zip 
Archive: patch2.zip 
    Length  Date Time Name 
--------- ---------- ----- ---- 
     0 2013-10-29 17:42 EXCLUDE/ 
     0 2013-10-29 17:24 EXCLUDE/inner/ 
     0 2013-10-29 17:24 EXCLUDE/inner/inner1.txt 
     0 2013-10-29 15:45 EXCLUDE/file.txt 
     0 2013-10-29 15:44 patch.jar 
     0 2013-10-29 15:44 system.properties 
---------      ------- 
     0      6 files 

我試過這個命令,只在它解壓縮文件,但不是文件夾及其內容:

$unzip -l patch2.zip -x EXCLUDE/* 
Archive: patch2.zip 
    Length  Date Time Name 
--------- ---------- ----- ---- 
     0 2013-10-29 17:42 EXCLUDE/ 
     0 2013-10-29 17:24 EXCLUDE/inner/ 
     0 2013-10-29 17:24 EXCLUDE/inner/inner1.txt 
     0 2013-10-29 15:44 patch.jar 
     0 2013-10-29 15:44 system.properties 
---------      ------- 
     0      5 files 

感謝您的幫助。

回答

8

您需要引用排除模式,以便將其傳遞給unzip。否則它會在被傳遞到unzip之前被外殼擴展。

嘗試:

unzip patch2.zip -x "EXCLUDE/*" 
+0

+1爲答案,因爲它接近OP的問題。我自己的只是一個「很好的瞭解」替代方案^^(現在這個名字已經很少了,而在早期的linux時代,它更爲出名) –

+0

謝謝你的完美工作。你能否解釋一下你的意思是「它傳遞給unzip,否則它會在被傳遞給unzip之前被shell擴展」。 – Ravi

+1

@Ravi閱讀關於[Globbing](http://tldp.org/LDP/abs/html/globbingref.html),這是shell將通配符模式轉換爲文件名時的情況。例如,當你運行'echo *'時,shell會將'*'擴展爲一個文件名列表,例如'file1','file2'等之後執行echo。結果,'echo *'變成'echo file1 file2'。 'echo'程序從不會看到通配符,它​​只能看到參數'file1'和'file2'。但是,如果引用模式「echo」*「',那麼shell將不執行此擴展,並且該模式將作爲參數傳遞給可以解釋它的程序,但它會選擇它。 – dogbane

0

@dogbane答案是正確的。

但我還是再添[希望] interresting選擇,因爲你是在Linux上:

mc 

(又名:午夜指揮官)

啓動它,然後:右側的面板上,導航至您希望文件最終到達的位置,然後在左側面板上瀏覽ZIP文件「內部」,然後在第一級選擇+複製所需的內容(即全選,然後取消選擇EXCLUDE文件夾,即可例如)

mc是非常靈活和漂亮特別是在tar/untar/zip /移動/刪除/重命名文件...(在windows上,相當於TotalCommander,我經常使用其「同步」選項來保持備份和源同步)。它允許您瀏覽檔案,就好像它們是未壓縮的一樣(試圖將實際的解壓縮最小化爲「導航」部分,因此您不會將它們解壓兩次)。

相關問題