next up previous
Next: 我要如何改變一個 symbolic link 的 permission 呢? Up: 中級的問題 Previous: 要怎樣才能截斷一個檔案?

為什麼執行 find 時所使用的  符號無法達到我預期的結果?

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 就會因此而混淆。



Tan Koan-Sin
1999-03-02