İki bulma komutu karşılaştırması


12

Son zamanlarda bu findtek astarı aldım, ancak aşağıdaki ikisinin farkının nereden geldiğini açıklayamıyorum:

örnek 1

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

./names:Madison Randy:300:Product Development

ÖRNEK 2

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

Madison Randy:300:Product Development

Gördüğünüz gibi, ilkinde bu dizenin türettiği belirli bir dosya var ve şimdiye kadar bunun neden olduğunu bulamıyorum.

Yanıtlar:


17

Grep'e 2 konum aramasını söylüyorsun. grep, yalnızca birden çok konum aranırsa tam konumu gösterir.

Örneğin

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

Yalnızca 1 dosyayı ararsam grep'in dosya adını nasıl atladığına dikkat edin

grep -i "foo" /tmp/herp
foo

Ancak birden fazla arama konumu belirlersem, grep her eşleşmeyi nerede bulduğunu söyler

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

Eklemek, /dev/nullgrep'i 2 argüman sağlayarak tam yolu yazdırmak için kandırıyor mu?


1
+1 ancak "açık "tan bahsetmeyi unuttunuz:" Eklenen dosyanın /dev/nullgrep-ed olan öğenin (boş) /dev/nulldosyada bulunmayacağından emin olmaktır , bu nedenle yalnızca doğru konumlar verilir "
Olivier Dulac

Ama aynı zamanda, arama /dev/nullyaparak boş olmayan bir kukla dosyadan arama yapmak için hiçbir zaman harcamazsınız. Ve son olarak, arama amacı /dev/nullbu deyime aşina olanlar için açıktır.
alexis

5

man grep:

-H, - dosyaadı ile

Her eşleşme için dosya adını yazdırın. Aranacak birden fazla dosya olduğunda bu varsayılan değerdir.

Fark, grep'in iki durumda bir veya iki dosya argümanı ile çağrılmasından kaynaklanır. /dev/nullEklemek yerine grepargümanı arayabilirsiniz -H. Belki de /dev/nulldavranış daha yaygın olarak desteklenmektedir.


3
grep -Htaşınabilir değildir - /dev/nullhile GNU grep olmadan çalışır.
Chris Down

4

İlk örnek, findifade sonucunda bulunan her dosya için iki dosya üzerinde grep çalıştırılmasına eşdeğerdir . Örneğin, eğer findbulgular üç dosya a.txt, b.txtve c.txtsonra grepolarak yarışacak

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

grepÇıktının eşleştiği dosya adını gösterir. / Dev / null ile hiçbir şey eşleşmeyeceğinden, ilk dosyanın dosya adının eşleşmesi durumunda yazdırılacağı garanti edilir.

Oysa ikinci örnek şuna eşdeğerdir:

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

Bu durumda, dosya adı tek bir argüman olduğundan eşleşmeler için yazdırılmaz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.