2012-04-28 51 views
17

我想在我當前位置的子目錄之間進行迭代並分別單獨gzip每個文件。對於目錄中的文件壓縮和解,我用如何在bash中的所有子目錄中gzip所有文件

for file in *; do gzip "$file"; done 

,但這可以在當前目錄下,而不是當前目錄的子目錄只是工作。我怎樣才能重寫上述語句,以便它也可以壓縮所有子目錄中的文件?

回答

41

無需環路或任何超過findgzip

find . -type f ! -name '*.gz' -exec gzip "{}" \; 

這個發現在和當前目錄中,其名稱不與.gz擴展以下的所有常規文件(即,所有尚未壓縮的文件)。它在每個文件上分別調用gzip


編輯,基於註釋從user unknown

花括號({})正在關注-exec你可以看到替換的文件名,這是直接傳遞,作爲一個單一的詞,到命令這裏:

$ touch foo 
$ touch "bar baz" 
$ touch xyzzy 
$ find . -exec echo {} \; 

./foo 
./bar baz 
./xyzzy 
+2

你最後一句話是一個常見的錯誤信息。查找知道文件名的起始位置和結束位置。它本身,它沒有空白或換行和其他有趣的事情的任何問題。因此'-exec gzip {}'用單個文件名調用gzip,並且由於沒有調用中間shell,這可以將空白解釋爲分隔符,gzip將接收整個文件名。 find的manpage中的提示看起來已經過時了,並且意味着:你的shell可以在傳遞給它之前嘗試解釋{},但是[多年以來]沒有看到這樣的shell(http://unix.stackexchange.com/q/ 4485分之8647)。 – 2012-04-29 14:37:03

+1

你每天都會學到新的東西。感謝您的教訓! – 2012-04-29 15:09:09

+2

對於exclude * .gz文件爲+1 – GuruM 2013-07-24 12:34:45

5
find . -type f | while read file; do gzip "$file"; done 
+1

如果文件包含空格或其他特殊字符,該怎麼辦?那不會與'for'一起工作 – c00kiemon5ter 2012-04-28 13:35:40

+1

@ c00kiemon5ter有沒有一個可行的答案,但可能不完整,應該得到一個downvote?根據SO的說法:「只要你遇到一個非常草率的,沒有努力的帖子,或者一個明顯的,或許是危險的不正確的答案,就使用你的低估。」這個答案不是那些東西。不完整,有點草率,但並不正確。你可能應該讓upvote進程付出代價並留下評論。 – 2012-04-28 13:40:50

+0

imo,答案是錯的。 Farshid從未指定過這些文件不包含特殊字符,所以你的回答只能回答這個問題的一個特例。你最好使用'find .. |同時閱讀..'。糾正你的答案,我將成爲第一個贊成的人。但不要問我提倡不正確的(imo)答案。 – c00kiemon5ter 2012-04-28 13:50:48

11

我更喜歡gzip -r ./它做同樣的事情,但更短。

相關問題