Command-Line

將文件名與 grep 一起列印會導致 find -exec

  • December 15, 2017

我有一個名為的程序foo,我想對通過 find 找到的每個結果執行該程序。所以是這樣的:

find . -name '*.o' -type f -exec foo {} \;

我想對foo某個字元串欄的所有這些呼叫的輸出進行 grep。所以我添加了這個:

find . -name '*.o' -type f -exec foo {} \; | grep bar

但是我失去了有關匹配來自哪些文件的原始資訊。我嘗試添加-fprintf /dev/stderr '%p\n'find命令中,但現在看起來 stdout 不見了,因為沒有列印 grep 結果。

如何將每個文件名列印到輸出,然後列印與該文件相對應的 grep 結果?

或者,如果有某種方法可以使工作-H參數grep也可以,但正如所寫的那樣,它不會起作用,因為我只是從標準輸入傳遞文本,並且grep不知道文件名。我嘗試了各種咒語xargs,但我也無法使任何咒語起作用。

要將每個文件名列印到輸出,然後列印與該文件相對應的 grep 結果,您可以將-exec foo {} | grep管道包裝在外殼中:

find . -name '*.o' -type f -print -exec sh -c 'foo "$1" | grep "bar"' sh {} \;

為了使-Hgrep 的參數與標準輸入一起工作,如果您的版本grep支持--label=您可以執行的選項

find . -name '*.o' -type f -exec sh -c '
 foo "$1" | grep -H --label="$1" "bar"
' sh {} \;

或(如果您的 find 支持 的+多參數替代方案\;):

find . -name '*.o' -type f -exec sh -c '
 for f; do foo "$f" | grep -H --label="$f" "bar"; done
' sh {} +

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