Command-Line
將文件名與 grep 一起列印會導致 find -exec
我有一個名為的程序
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 {} \;
為了使
-H
grep 的參數與標準輸入一起工作,如果您的版本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 {} +