Poate că este puțin ciudat – și poate există și alte instrumente pentru a face acest lucru, dar, bine ..
Folosesc următoarea comandă bash clasică pentru a găsi toate fișierele care conțin un șir:
find . -type f | xargs grep "something"
Am un număr mare de fișiere, pe adâncimi multiple Prima apariție a „ceva” este suficientă pentru mine, dar găsirea continuă căutarea și durează mult timp pentru a finaliza restul fișierelor. Ce aș dori să fac este ceva de genul „feedback” de la grep înapoi pentru a găsi astfel încât find ar putea să nu mai caute mai multe fișiere. Este posibil așa ceva?
Răspuns
Pur și simplu păstrați-l în domeniul găsirii:
find . -type f -exec grep "something" {} \; -quit
Acesta este modul în care funcționează:
-exec
va funcționa atunci când -type f
va fi adevărat. Și pentru că grep
returnează 0
(succes / true) când are o potrivire, -quit
va fi declanșat.
Răspuns
find -type f | xargs grep e | head -1
face exact asta: atunci când head
se termină, elementul de mijloc al țevii este notificat cu o” țeavă spartă „semnal, se termină la rândul său și notifică find
. Ar trebui să vedeți o notificare precum
xargs: grep: terminated by signal 13
care confirmă acest lucru.
Comentarii
- +1 pentru explicație și alternativă, deși celălalt răspuns mi se pare mai elegant, deoarece este mai autosuficient
Răspuns
Pentru a face acest lucru fără a schimba instrumentele: (I love xargs)
#!/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
Comentarii
- +1 nu a știut niciodată că xargs ar avea astfel de capacități de multitasking – mulțumesc și pentru alte comentarii! 🙂