2014-02-10 104 views
2

我試圖在subversion中更新一個文件。我需要在makefile中添加一行,以便構建修訂版本的代碼。這是我試圖在make文件中找到的地方。關於Linux命令的問題「find -exec {}」

找到。 -name「* ake *」-exec grep filename {}/dev/null \;

它的工作原理。但我的問題是: 1.什麼是「\;」對於?如果我改變它,會有錯誤信息。

2/dev/null沒有改變結果。我知道這是處理所有「垃圾信息」的設備。但在這種情況下我還是不太明白。

在此先感謝!

+0

我不知道的/ dev/null的位置有一定的作用 - 這應該擴展到簡單的「grep的文件名{current_file_path}」在/ dev/null不應該是必需的。 –

+0

'/ dev/null'令我困惑。也許創建者認爲'find'是作爲globbing工作的,無論'find'發現了什麼或者沒有找到'exec',爲'grep'提供至少一個文件來搜索?無論如何,我認爲它沒有任何原因。 – Wrikken

+0

'find ... -exec grep -e filename/dev/null {} +'順便說一下會更有效率;在這個用例中,'\;'變體沒有意義。 –

回答

4

\;指示將由find執行的命令的結束。需要\來停止shell解釋;本身。從man find

-exec command ; 
      Execute command; true if 0 status is returned. All following 
      arguments to find are taken to be arguments to the command until an 
      argument consisting of ‘;’ is encountered. 

/dev/null是一個聰明的伎倆,我花了一段時間才能找出。如果grep傳遞多個文件名,它將在每次匹配之前打印包含文件名。 /dev/null充當不包含匹配的空文件,但使得grep認爲它始終傳遞多個文件名。由理查德提出了一個更清晰的替代方法是使用grep的-H選項:

 -H, --with-filename 
       Print the filename for each match. This is the default when there 
       is more than one file to search. 
+1

所以可以使用'grep -H' –

+0

是的,實際上我會說這將是一個更明確,因此更好的方法。 –

+0

可能值得注意的是,'-exec command {} +'是另一種POSIX標準化的用法,當命令是'grep'時完全有效,並且與每個結果運行grep命令相比,效率也更高。 –