Mám program s názvem foo
které chci provést u každého výsledku, který je nalezen pomocí find. Takže něco takového:
find . -name '*.o' -type f -exec foo {} ;
Chci grep výstup všech těchto vyvolání foo
pro určitou strunu. Takže přidávám toto:
find . -name '*.o' -type f -exec foo {} ; | grep bar
Ale ztrácím původní informace o tom, z jakých souborů pocházejí shody. Zkusil jsem přidat -fprintf /dev/stderr '%pn'
do find
ale nyní to vypadá, že stdout je pryč, protože se nevytisknou žádné výsledky grep.
Jak mohu vytisknout každý název souboru na výstup a PAK nechat vytisknout výsledky grep odpovídající tomuto souboru?
Případně, pokud by existoval nějaký způsob, jak vytvořit -H
argument grep
práce, která by byla také v pořádku, ale jak je napsáno, nebude fungovat, protože jen předávám text ze stdin a grep
nezná název souboru. Zkoušel jsem různá zaklínadla xargs
, ale ani to se mi nepodařilo zprovoznit.
Přijatá odpověď:
Chcete-li získat každý název souboru vytištěný na výstup a PAK vytisknout výsledky grep odpovídající tomuto souboru, můžete zabalit -exec foo {} | grep
potrubí ve skořápce:
find . -name '*.o' -type f -print -exec sh -c 'foo "$1" | grep "bar"' sh {} ;
Chcete-li vytvořit -H
argument grep pracuje se standardním vstupem, pokud je vaše verze grep
podporuje --label=
možnost, kterou můžete udělat
find . -name '*.o' -type f -exec sh -c '
foo "$1" | grep -H --label="$1" "bar"
' sh {} ;
nebo (pokud váš nález podporuje +
víceargumentová alternativa k ;
):
find . -name '*.o' -type f -exec sh -c '
for f; do foo "$f" | grep -H --label="$f" "bar"; done
' sh {} +