Shell
管道作為 find 的 -exec 參數
是否可以使用管道命令作為 find
-exec
選項的參數?這意味著,我想做這樣的事情:find . -name CMakeLists* -exec cat '{}' | grep lib \;
我試圖
cat '{}' | grep lib
為每個文件執行的地方,但這不起作用。引用也不起作用。有人有建議嗎?更新:
回答了特定的問題。現在,有沒有辦法讓通用
find <path> -type f -name <name> -exec <pipeline-command>
模式起作用?
find . -type f -name "CMakeLists*" -exec grep lib /dev/null {} +
這會在目前目錄中查找basename 開頭或為 string 的文件
CMakeLists
。參數被轉義(雙引號),以便 shell 在執行之前不會擴展它find
。沒有必要添加
cat
管道到grep
— 這是一個無用 IO 的無用程序,這裡。當有多個文件要匹配時,添加將報告文件名以及匹配行的/dev/null
保險。grep
通過
{} +
用作參數的終止序列,可以將-exec
多個文件名傳遞給grep
命令的每次呼叫。如果我們使用{} \;
,那麼每個找到的文件grep
都會產生一個程序。如果進行數百或數千次,不必要的程序實例化是昂貴的。要使用帶
find
-exec
參數的管道,您需要呼叫 shell。一個人為的例子可能是grep
字元串“one”,但前提是字元串“two”也不存在。這可以這樣做:find . -type f -name "CMakeLists*" -exec sh -c 'grep one "$@"|grep -v two' sh {} +
這是基於@muru、@Serg 和@Scott 的以下評論,謝謝。