Saya memiliki program bernama foo
yang ingin saya jalankan pada setiap hasil yang ditemukan melalui find. Jadi kira-kira seperti ini:
find . -name '*.o' -type f -exec foo {} ;
Saya ingin mengambil output dari semua pemanggilan foo
untuk string bar tertentu. Jadi saya menambahkan ini:
find . -name '*.o' -type f -exec foo {} ; | grep bar
Tapi saya kehilangan informasi asli tentang file apa yang cocok dengan itu. Saya mencoba menambahkan -fprintf /dev/stderr '%pn'
ke find
perintah tetapi sekarang sepertinya stdout hilang, karena tidak ada hasil grep yang dicetak.
Bagaimana saya bisa mendapatkan setiap nama file yang dicetak ke output dan KEMUDIAN memiliki hasil grep yang sesuai dengan file yang dicetak setelahnya?
Atau, jika ada cara untuk membuat -H
argumen grep
pekerjaan itu juga akan baik-baik saja, tetapi seperti yang tertulis itu tidak akan berfungsi karena saya hanya meneruskan teks dari stdin, dan grep
tidak tahu nama filenya. Saya mencoba berbagai mantra xargs
, tapi saya juga tidak bisa melakukannya.
Jawaban yang Diterima:
Untuk mendapatkan setiap nama file yang dicetak ke output dan KEMUDIAN memiliki hasil grep yang sesuai dengan file yang dicetak setelahnya, Anda bisa membungkus -exec foo {} | grep
pipa dalam cangkang:
find . -name '*.o' -type f -print -exec sh -c 'foo "$1" | grep "bar"' sh {} ;
Untuk membuat -H
argumen grep berfungsi dengan input standar, jika versi grep
. Anda mendukung --label=
pilihan yang bisa Anda lakukan
find . -name '*.o' -type f -exec sh -c '
foo "$1" | grep -H --label="$1" "bar"
' sh {} ;
atau (jika temuan Anda mendukung +
alternatif multi-argumen untuk ;
):
find . -name '*.o' -type f -exec sh -c '
for f; do foo "$f" | grep -H --label="$f" "bar"; done
' sh {} +