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! 🙂