2013-02-11 21 views
9

我一直在嘗試一段時間,並相信我相當接近這一點,但我對Unix相當新,所以一直覺得這很難。找到所有的拉鍊,並解壓到位 - Unix

我有一個文件夾,其中包含許多文件夾,其中一些文件夾中有zip文件,有些文件夾沒有。我試圖解壓縮任何子目錄中的所有zip文件。

例如,我有:

文件/ A/something.java

文件/ B/somezipfile.zip

文件/ C/someotherfile.zip

文件/ d/AnotherZipFile.zip

我想解壓縮它們(假設zip只包含.java文件),得到如下結果: files/A/something.ja VA

文件/ B/javafile.java

文件/ C/someotherfilefromzip.java

文件/ d/Anotherfile.java

我不介意的ZIP文件保持或者解壓縮後刪除,或者很好。

我到目前爲止試過的東西。

1)我希望我可以用管道,我是新來的,就像這樣:

find . -name *.zip | unzip 

這是行不通的。

2)我花了一些時間來尋找,最近我得到了使用的解決方案在線是:

find . -name '*.zip' -exec unzip '{}' ';' 

這種解壓,但他們解壓縮到當前的工作目錄,我希望他們在地方解壓。我也不明白這個我想要學習的命令。

任何幫助,非常感謝。

感謝,

回答

26
find . -name '*.zip' -exec sh -c 'unzip -d `dirname {}` {}' ';' 

此命令在當前目錄及其子目錄中的遞歸匹配*.zip模式名稱的文件的外觀。對於文件中找到它執行命令sh有兩個參數:

-c 

unzip -d `dirname <filename>` <filename> 

哪裏<filename>是被發現的文件名。命令sh是Unix shell解釋器。選項-c告訴shell下一個參數應該被解釋爲shell腳本。所以shell解釋下面的腳本:

unzip -d `dirname <filename>` <filename> 

運行前unzip外殼擴展命令,做不同的替換。在該特定示例它可以代替

`dirname <filename>` 

與命令dirname <filename>的輸出實際上輸出,其中文件被放置目錄名。所以,如果文件名是./a/b/c/d.zip,外殼會擦unzip這樣的:

unzip -d ./a/b/c ./a/b/c/d.zip 

如果您ZIP文件名或目錄名有空格,用這個:

find . -name '*.zip' -exec sh -c 'unzip -d "`dirname \"{}\"`" "{}"' ';' 
+0

這看起來像一個很好的答案,你有可能(很快)幫助我理解它嗎?我對這一點感到困惑,因爲它需要-exec和{}標記。 – ThePerson 2013-02-11 13:58:02

+1

新增說明 – 2013-02-11 15:08:39

+0

如果zips文件名中有空格,我似乎遇到問題,有沒有簡單的解決方法? – ThePerson 2013-02-11 15:14:47

7
find . -name '*.zip' | xargs -n1 unzip 
19

使用-execdir代替-exec,它在找到該文件的目錄中運行命令,而不是從中運行find的目錄。

find . -name '*.zip' -execdir unzip '{}' ';' 
+0

工作得非常出色。您介意解釋「{}」的作用(文件名佔位符?)以及爲什麼「';」需要單獨引用?謝謝! – 2017-10-22 15:57:40

+0

{}表示當前正在操作的文件 – Tebe 2017-12-06 05:43:08

相關問題