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

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *