Kanske är det lite konstigt – och kanske finns det andra verktyg för att göra detta men, ja ..
Jag använder följande klassiska bash-kommando för att hitta alla filer som innehåller någon sträng:
find . -type f | xargs grep "something"
Jag har ett stort antal filer, på flera djup Första förekomsten av ”något” räcker för mig, men hitta fortsätter att söka och tar lång tid att slutföra resten av filerna. Vad jag skulle vilja göra är något som en ”feedback” från grep tillbaka för att hitta så att hitta kan sluta söka efter fler filer. Är det möjligt?
Svar
Håll det bara inom sökområdet:
find . -type f -exec grep "something" {} \; -quit
Så här fungerar det:
-exec
fungerar när -type f
kommer att vara sant. Och för att grep
returnerar 0
(success / true) när har en matchning, -quit
utlöses.
Svar
find -type f | xargs grep e | head -1
gör exakt det: när head
avslutas meddelas rörets mittelement med ett” trasigt rör ”signal, avslutas i tur och ordning och meddelar find
. Du bör se ett meddelande som
xargs: grep: terminated by signal 13
som bekräftar detta.
Kommentarer
- +1 för förklaring och alternativ, även om det andra svaret verkar mer elegant för mig eftersom det är mer självförsörjande
Svar
För att göra detta utan att byta verktyg: (Jag älskar 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
Kommentarer
- +1 visste aldrig att xargs skulle ha sådana multitasking-funktioner – tack också för andra kommentarer! 🙂