Misschien is het een beetje vreemd – en misschien zijn er andere tools om dit te doen, maar, nou ..

Ik gebruik de volgende klassieke bash-opdracht om alle bestanden te vinden die een tekenreeks bevatten:

find . -type f | xargs grep "something" 

Ik heb een groot aantal bestanden, op meerdere diepten . eerste keer dat “iets” voorkomt is genoeg voor mij, maar find gaat door met zoeken en het duurt lang om de rest van de bestanden te voltooien. Wat ik zou willen doen is zoiets als een “feedback” van grep terug om te vinden zodat find zou kunnen stoppen met zoeken naar meer bestanden. Is zoiets mogelijk?

Answer

Houd het gewoon binnen het bereik van find:

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

Dit is hoe het werkt:

De -exec zal werken wanneer de -type f zal waar zijn. En omdat grep retourneert 0 (success / true) wanneer de heeft een overeenkomst, de -quit wordt geactiveerd.

Antwoord

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

doet precies dat: wanneer de head eindigt, wordt het middelste element van de pijp gewaarschuwd met een” gebroken pijp “signal, eindigt op zijn beurt, en informeert de find. U zou een melding moeten zien zoals

xargs: grep: terminated by signal 13 

die dit bevestigt.

Opmerkingen

  • +1 voor uitleg en het alternatief, hoewel het andere antwoord mij eleganter lijkt, omdat het meer zelfvoorzienend is

Antwoord

Om dit te doen zonder tools te veranderen: (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 

Reacties

  • +1 nooit geweten dat xargs zulke multitasking-mogelijkheden zou hebben – ook bedankt voor andere commentaren! 🙂

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *