我經常使用find
在一堆文件上運行相同的腳本。因此,舉例來說,如果我想在dir
運行所有.png
文件process.py
,我會做:如何使用find -exec沒有大量轉義
find dir -name '*.png' -execdir process.py \{\} \;
到底柵欄的事情很煩人,周圍沒有任何辦法嗎?
我經常使用find
在一堆文件上運行相同的腳本。因此,舉例來說,如果我想在dir
運行所有.png
文件process.py
,我會做:如何使用find -exec沒有大量轉義
find dir -name '*.png' -execdir process.py \{\} \;
到底柵欄的事情很煩人,周圍沒有任何辦法嗎?
根據您的鍵盤佈局,"
可能比'
或\
更方便使用。只要Unix & Linux Stack Exchange站點知道,{}
不需要轉義。沒有人可以識別出需要{}
的shell,並且手冊頁中的示例不會逃過大括號。
find dir -name "*.png" -execdir process.py {} ";"
Jonathan Leffler最終有一個解決方案+,它在語義上並不相同,但經常可用。
用途:
find dir -name '*.png' -execdir process.py {} +
的{}
不需逸出;它們在相當有限的情況下只對殼有特殊的意義。 (特別是,echo {}
呼應大括號,而echo {a,b,c}
呼應a b c
。)+
也不需要轉義。它告訴find
'正在玩xargs
'。也就是說,它將使用盡可能多的文件名來運行該命令,因爲它可以爲每次執行合理地執行。
注意,使用-exec
或-execdir
自動,全面地用在文件名中的空格(—換行,退格,換頁,任何人嗎?等尷尬的角色)問題的交易。將-print
與xargs
配對的名字在這裏遇到問題。 GNU find
加上GNU xargs
提供-print0
選項到find
和-0
選項到xargs
以解決文件名中奇數字符的問題。
如果您必須爲每個文件執行一次腳本,那麼您需要在末尾使用轉義的分號;有沒有簡單的方法(除非你數:SC=";"; find ... {} $SC
,我不這樣做)。
我看到的唯一問題是在子目錄中運行腳本的-execdir
。當在不同目錄中有不同的文件時,你必須檢查它的行爲是否理智,並且當與-execdir
一起使用時,你需要確保{}
轉換爲'相對於它所在的目錄的文件名'否則,該文件通常不能通過給腳本的名稱來定位)。所有這些都應該「正常工作」,因爲如果選項沒有的話,選項將不會有意義。
就個人而言,我寧願使用普通的-exec
,但可能有一個很好的理由,你爲什麼選擇-execdir
。
發現自己需要注意,它發現的文件會正確傳遞到您的腳本,無論您使用-exec還是-execdir - 無需擔心。在文件所在的目錄中執行程序有時很有用 - 重命名,讀取一些配置信息,...。 – 2012-04-25 17:17:28
要使用,它幾乎必須這樣做。我沒有使用'-execdir'(我必須去檢查手冊頁,看看它做了什麼)。我可以看到它偶爾會有點幫助,但是對於基本上我能想到的任何情況,我的腳本風格不會受'-exec'和'-execdir'的影響。 – 2012-04-25 17:19:28
對於這個人爲的例子感到抱歉,但是@userunknown解決了這個問題:process.py所在的目錄比它找到的文件多得多,所以相對路徑很重要。 – Shep 2012-04-25 17:21:42
您可以單引號'{}'';'相反,但你必須以某種方式防止shell自己解釋這些字符。如果找到的數量很小,xargs也可以工作。
有趣的是,如果找到的文件數量很少,那麼你會說「'xargs'也能工作」,因爲'xargs'的全部意義在於,如果找到的文件數量巨大,它將起作用。它將文件分割成可管理的組,併爲每個組執行命令。 – 2014-02-03 14:02:34
這解決了這一問題。我喜歡[Jonathan的回答](http://stackoverflow.com/a/10320437/915501),但我不想改變效果,只是爲了避免輸入所有的\。至少這少兩個。 – Shep 2012-04-25 17:26:19
不知道我明白這一點:'Nowbody可以告訴一個shell,它會在需要屏蔽的地方寫入man page。'[man page examples](http://ss64.com/bash/find.html #examples)的確顯示''{}'',但這顯然不是bash所要求的(我選中了)。 – Shep 2012-04-25 17:43:28
@Shep:[這是關於{}]的U&L宣傳活動(http://unix.stackexchange.com/questions/8647/gnu-find-and-masking-the-for-some-shells-這是由我開始的) 。 – 2012-04-25 18:07:45