Find 指令有一個 -exec 的選項會針對每一個找到的檔案執行一個特殊 的指令。 Find 會把出現 的地方置換成目前找到的檔案名稱。因此, 也許有一天您會使用 find 指令對每一個檔案執行某個指令,或者對 一個目錄執行某個指令。
find /path -type d -exec command {}/\* \;希望 find 能依序執行以下指令:
command directory1/* command directory2/* ...
command {}/* command {}/* ...也許您可以把它當成 bug, 也可以把它看成是故意設計的特異功能。但我們 可不願被目前這個特異功能干擾。所以要怎樣避免這個問題呢?其中一種做 法是寫一個小小的 shell script,名稱就叫做 ./doit 好了,其內容如下:
command "$1"/*那麼您就可以把原來的命令行改寫為
find /path -type d -exec ./doit {} \;如果您想省掉 ./doit 這個 shell script, 可以這麼寫:
find /path -type d -exec sh -c 'command $0/*' {} \;(這種寫法可行的原因是 "sh -c 'command' A B C ..."指令當中,$0會展開為 A, $1會展開為B, 依此類推)
或者您也可以略施小計使用 sed 來造出您想執行的指令行:
find /path -type d -print | sed 's:.*:command &/*:' | sh如果您想減少 command 的執行次數,您可以先檢查看看系統中有沒有 xargs 這個指令, xargs會從標準輸入一次讀取一行,並且把這些讀入的資料 合併至一個命令行內。您可以寫成以下命令行:
find /path -print | xargs command這樣會使以下指令執行一次或多次:
command file1 file2 file3 file4 dir1/file1 dir1/file2很不幸地,這並不是完美無缺或者萬無一失的解法,輸入 xargs 的文字行 必須以換行字元結尾,所以當檔案名稱當中有奇怪的字元(如換行字元)時, xargs 就會因此而混淆。