Dua menemukan perintah perbandingan

12

Baru-baru ini saya menerima findone-liner ini, tetapi saya tidak dapat menjelaskan dari mana perbedaan dua di bawah ini:

Contoh 1

[root@centos share]# find . -exec grep -i "madis" {} /dev/null \;

./names:Madison Randy:300:Product Development

Contoh 2

[root@centos share]# find . -exec grep -i "madis" {} \;

Madison Randy:300:Product Development

Seperti yang Anda lihat, pada file pertama ada file spesifik yang berasal dari string ini dan sejauh ini saya benar-benar tidak dapat mengetahui mengapa ini terjadi.

VVelev
sumber

Jawaban:

17

Anda memberi tahu grep untuk mencari 2 lokasi. grep hanya menampilkan lokasi lengkap jika beberapa lokasi dicari.

Sebagai contoh

touch /tmp/herp /tmp/derp
cd /tmp
echo "foo" > herp
echo "foo" > derp

Perhatikan bagaimana jika saya mencari hanya 1 file, grep menghilangkan nama file

grep -i "foo" /tmp/herp
foo

Tetapi jika saya menentukan beberapa lokasi pencarian, grep mengatakan di mana ia menemukan setiap kecocokan

grep -i "foo" herp derp
/tmp/derp:foo
/tmp/herp:foo

Menambahkan /dev/nullis the tricking grep dalam mencetak path lengkap, dengan memberikan 2 argumen.

spuder
sumber
1
+1 tetapi Anda lupa menyebutkan "jelas": "Alasan file yang ditambahkan /dev/nulladalah untuk memastikan bahwa apa pun yang grep-ed tidak akan ditemukan dalam file (kosong) /dev/null, jadi hanya lokasi yang benar yang dihasilkan"
Olivier Dulac
Tetapi juga, dengan mencari /dev/nullAnda tidak perlu membuang waktu mencari file dummy yang tidak kosong. Dan akhirnya, niat mencari /dev/nulljelas bagi mereka yang akrab dengan idiom ini.
alexis
5

man grep:

-H, --dengan nama file

Cetak nama file untuk setiap kecocokan. Ini adalah default ketika ada lebih dari satu file untuk dicari.

Perbedaan hasil dari grep dipanggil dengan satu atau dua argumen file dalam dua kasus. Alih-alih menambahkan /dev/nullAnda bisa menelepon grepdengan argumen -H. Mungkin /dev/nullperilakunya lebih banyak didukung.

Hauke ​​Laging
sumber
3
grep -Htidak portabel - /dev/nulltriknya bekerja tanpa GNU grep.
Chris Down
4

Contoh pertama setara dengan menjalankan grep pada dua file untuk setiap file yang ditemukan sebagai hasil dari findekspresi. Misalnya, jika findtemuan tiga file a.txt, b.txtdan c.txtkemudian grepakan dijalankan sebagai

grep -i "madis" a.txt /dev/null
grep -i "madis" b.txt /dev/null 
grep -i "madis" c.txt /dev/null

Yang grepakan menampilkan nama file yang cocok dengan output. Karena tidak ada yang cocok dengan / dev / null, dijamin nama file dari file pertama akan dicetak jika cocok.

Sedangkan, contoh kedua setara dengan

grep -i "madis" a.txt
grep -i "madis" b.txt 
grep -i "madis" c.txt 

Dalam hal ini nama file tidak akan dicetak untuk pertandingan karena hanya ada satu argumen.

mkc
sumber