bash bul xargs grep sadece tek bir olay


16

Belki biraz gariptir - ve belki bunu yapacak başka araçlar da vardır, ama ..

Bazı dize içeren tüm dosyaları bulmak için aşağıdaki klasik bash komutunu kullanıyorum:

find . -type f | xargs grep "something"

Birden fazla derinlikte çok sayıda dosyam var. "bir şey" in ilk ortaya çıkışı benim için yeterli, ancak bulmaya devam ediyor ve dosyaların geri kalanını tamamlaması uzun sürüyor. Ne yapmak istiyorum bulmak için geri "grep geri" gibi bir şey bulmak daha fazla dosya için arama durdurmak olabilir. Böyle bir şey mümkün mü?

Yanıtlar:


20

Sadece onu bulma alanı içinde tutun:

find . -type f -exec grep "something" {} \; -quit

Bu nasıl çalışır:

-execNe zaman çalışacak -type fgeçerli olacak. Ve bir eşleşme olduğunda grepgeri dönüşler 0(başarı / doğru) olduğundan, tetiklenir.-exec grep "something"-quit


8
find -type f | xargs grep e | head -1

tam olarak bunu yapar: headsona erdiğinde, borunun orta elemanı bir 'kırık boru' sinyali ile bildirilir, sırayla sona erer ve find. Gibi bir bildirim görmelisiniz

xargs: grep: terminated by signal 13

Bu da bunu doğrular.


Açıklama ve alternatif için +1, ancak diğer cevap benim için daha zarif gibi görünse de, daha kendi kendine yeterli
hello_earth

8

Bunu araçları değiştirmeden yapmak için: (xargs'ı seviyorum)

#!/bin/bash
find . -type f |
    # xargs -n20 -P20: use 10 parallel processes to grep files in batches of 20
    # grep -m1: show just on match per file
    # grep --line-buffered: multiple matches from independent grep processes
    #      will not be interleaved
    xargs -P10 -n20 grep -m1 --line-buffered "$1" 2> >(
        # Error output (stderr) is redirected to this command.
        # We ignore this particular error, and send any others back to stderr.
        grep -v '^xargs: .*: terminated by signal 13$' >&2
    ) |
    # Little known fact: all `head` does is send signal 13 after n lines.
    head -n 1

1
+1, xargs'ın bu tür çoklu görev yeteneklerine sahip olacağını hiç bilmiyordu - diğer yorumlar için de teşekkürler! :)
hello_earth
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.