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