2012-04-25 31 views
2

我經常使用find在一堆文件上運行相同的腳本。因此,舉例來說,如果我想在dir運行所有.png文件process.py,我會做:如何使用find -exec沒有大量轉義

find dir -name '*.png' -execdir process.py \{\} \; 

到底柵欄的事情很煩人,周圍沒有任何辦法嗎?

回答

5

根據您的鍵盤佈局,"可能比'\更方便使用。只要Unix & Linux Stack Exchange站點知道,{}不需要轉義。沒有人可以識別出需要{}的shell,並且手冊頁中的示例不會逃過大括號。

find dir -name "*.png" -execdir process.py {} ";" 

Jonathan Leffler最終有一個解決方案+,它在語義上並不相同,但經常可用。

+0

這解決了這一問題。我喜歡[Jonathan的回答](http://stackoverflow.com/a/10320437/915501),但我不想改變效果,只是爲了避免輸入所有的\。至少這少兩個。 – Shep 2012-04-25 17:26:19

+0

不知道我明白這一點:'Nowbody可以告訴一個shell,它會在需要屏蔽的地方寫入man page。'[man page examples](http://ss64.com/bash/find.html #examples)的確顯示''{}'',但這顯然不是bash所要求的(我選中了)。 – Shep 2012-04-25 17:43:28

+0

@Shep:[這是關於{}]的U&L宣傳活動(http://unix.stackexchange.com/questions/8647/gnu-find-and-masking-the-for-some-shells-這是由我開始的) 。 – 2012-04-25 18:07:45

5

用途:

find dir -name '*.png' -execdir process.py {} + 

{}不需逸出;它們在相當有限的情況下只對殼有特殊的意義。 (特別是,echo {}呼應大括號,而echo {a,b,c}呼應a b c。)+也不需要轉義。它告訴find'正在玩xargs'。也就是說,它將使用盡可能多的文件名來運行該命令,因爲它可以爲每次執行合理地執行。

注意,使用-exec-execdir自動,全面地用在文件名中的空格(—換行,退格,換頁,任何人嗎?等尷尬的角色)問題的交易。將-printxargs配對的名字在這裏遇到問題。 GNU find加上GNU xargs提供-print0選項到find-0選項到xargs以解決文件名中奇數字符的問題。

如果您必須爲每個文件執行一次腳本,那麼您需要在末尾使用轉義的分號;有沒有簡單的方法(除非你數:SC=";"; find ... {} $SC,我不這樣做)。

我看到的唯一問題是在子目錄中運行腳本的-execdir。當在不同目錄中有不同的文件時,你必須檢查它的行爲是否理智,並且當與-execdir一起使用時,你需要確保{}轉換爲'相對於它所在的目錄的文件名'否則,該文件通常不能通過給腳本的名稱來定位)。所有這些都應該「正常工作」,因爲如果選項沒有的話,選項將不會有意義。

就個人而言,我寧願使用普通的-exec,但可能有一個很好的理由,你爲什麼選擇-execdir

+0

發現自己需要注意,它發現的文件會正確傳遞到您的腳本,無論您使用-exec還是-execdir - 無需擔心。在文件所在的目錄中執行程序有時很有用 - 重命名,讀取一些配置信息,...。 – 2012-04-25 17:17:28

+0

要使用,它幾乎必須這樣做。我沒有使用'-execdir'(我必須去檢查手冊頁,看看它做了什麼)。我可以看到它偶爾會有點幫助,但是對於基本上我能想到的任何情況,我的腳本風格不會受'-exec'和'-execdir'的影響。 – 2012-04-25 17:19:28

+0

對於這個人爲的例子感到抱歉,但是@userunknown解決了這個問題:process.py所在的目錄比它找到的文件多得多,所以相對路徑很重要。 – Shep 2012-04-25 17:21:42

0

您可以單引號'{}'';'相反,但你必須以某種方式防止shell自己解釋這些字符。如果找到的數量很小,xargs也可以工作。

+0

有趣的是,如果找到的文件數量很少,那麼你會說「'xargs'也能工作」,因爲'xargs'的全部意義在於,如果找到的文件數量巨大,它將起作用。它將文件分割成可管理的組,併爲每個組執行命令。 – 2014-02-03 14:02:34