Ehkä se on vähän outoa – ja ehkä on olemassa muita työkaluja tämän tekemiseen, mutta hyvin ..

Käytän seuraavaa klassista bash-komentoa kaikkien tiedostojen löytämiseen, jotka sisältävät jonkun merkkijonon:

find . -type f | xargs grep "something" 

Minulla on suuri määrä tiedostoja, useilla syvyyksillä . ”jotain” ensimmäinen esiintyminen riittää minulle, mutta haku jatkaa hakua ja vie kauan aikaa muiden tiedostojen viimeistelyyn. Haluaisin tehdä jotain sellaista kuin ”palaute” grep backiltä löytää niin, että Etsi voi lopettaa uusien tiedostojen etsinnän. Onko sellainen mahdollista?

Vastaa

Pidä se vain löytämisen alueella.

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

Näin se toimii:

-exec toimii, kun -type f on totta. Ja koska grep palauttaa 0 (menestys / tosi), kun -sovelluksella on osuma, -quit käynnistyy.

Vastaa

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

tekee juuri sen: kun head päättyy, putken keskiosa ilmoitetaan rikkoutuneella putkella ”signaali, päättyy vuorotellen ja ilmoittaa find. Näet ilmoituksen, kuten

xargs: grep: terminated by signal 13 

, joka vahvistaa tämän.

Kommentit

  • +1 selitykseksi ja vaihtoehdoksi, vaikka toinen vastaus vaikuttaa mielestäni tyylikkäämmältä, koska se on omavaraisempi

vastaus

Voit tehdä tämän muuttamatta työkaluja: (Rakastan xargsia)

#!/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 

Kommentit

  • +1 ei koskaan tiennyt, että xargsilla olisi niin monia tehtäviä – kiitos myös muista kommenteista! 🙂

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *