我想在我當前位置的子目錄之間進行迭代並分別單獨gzip每個文件。對於目錄中的文件壓縮和解,我用如何在bash中的所有子目錄中gzip所有文件
for file in *; do gzip "$file"; done
,但這可以在當前目錄下,而不是當前目錄的子目錄只是工作。我怎樣才能重寫上述語句,以便它也可以壓縮所有子目錄中的文件?
我想在我當前位置的子目錄之間進行迭代並分別單獨gzip每個文件。對於目錄中的文件壓縮和解,我用如何在bash中的所有子目錄中gzip所有文件
for file in *; do gzip "$file"; done
,但這可以在當前目錄下,而不是當前目錄的子目錄只是工作。我怎樣才能重寫上述語句,以便它也可以壓縮所有子目錄中的文件?
無需環路或任何超過find
和gzip
:
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
find . -type f | while read file; do gzip "$file"; done
如果文件包含空格或其他特殊字符,該怎麼辦?那不會與'for'一起工作 – c00kiemon5ter 2012-04-28 13:35:40
@ c00kiemon5ter有沒有一個可行的答案,但可能不完整,應該得到一個downvote?根據SO的說法:「只要你遇到一個非常草率的,沒有努力的帖子,或者一個明顯的,或許是危險的不正確的答案,就使用你的低估。」這個答案不是那些東西。不完整,有點草率,但並不正確。你可能應該讓upvote進程付出代價並留下評論。 – 2012-04-28 13:40:50
imo,答案是錯的。 Farshid從未指定過這些文件不包含特殊字符,所以你的回答只能回答這個問題的一個特例。你最好使用'find .. |同時閱讀..'。糾正你的答案,我將成爲第一個贊成的人。但不要問我提倡不正確的(imo)答案。 – c00kiemon5ter 2012-04-28 13:50:48
我更喜歡gzip -r ./
它做同樣的事情,但更短。
你最後一句話是一個常見的錯誤信息。查找知道文件名的起始位置和結束位置。它本身,它沒有空白或換行和其他有趣的事情的任何問題。因此'-exec gzip {}'用單個文件名調用gzip,並且由於沒有調用中間shell,這可以將空白解釋爲分隔符,gzip將接收整個文件名。 find的manpage中的提示看起來已經過時了,並且意味着:你的shell可以在傳遞給它之前嘗試解釋{},但是[多年以來]沒有看到這樣的shell(http://unix.stackexchange.com/q/ 4485分之8647)。 – 2012-04-29 14:37:03
你每天都會學到新的東西。感謝您的教訓! – 2012-04-29 15:09:09
對於exclude * .gz文件爲+1 – GuruM 2013-07-24 12:34:45