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 {} +