Shell

管道作為 find 的 -exec 參數

  • January 10, 2017

是否可以使用管道命令作為 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 的以下評論,謝謝。

引用自:https://unix.stackexchange.com/questions/336108