Kanskje det «er litt rart – og kanskje det er andre verktøy for å gjøre dette, men, vel ..
Jeg bruker følgende klassiske bash-kommando for å finne alle filene som inneholder noen streng:
find . -type f | xargs grep "something"
Jeg har et stort antall filer, på flere dybder første forekomst av «noe» er nok for meg, men finn fortsetter å søke, og det tar lang tid å fullføre resten av filene. Det jeg ønsker å gjøre er noe som en «tilbakemelding» fra grep tilbake for å finne slik at finne kan slutte å søke etter flere filer. Er noe slikt mulig?
Svar
Bare hold det innenfor området finn:
find . -type f -exec grep "something" {} \; -quit
Slik fungerer det:
-exec
fungerer når -type f
vil være sant. Og fordi grep
returnerer 0
(suksess / sant) når har samsvar, -quit
blir utløst.
Svar
find -type f | xargs grep e | head -1
gjør akkurat det: når head
avsluttes, blir midtelementet i røret varslet med et» ødelagt rør «signal, avsluttes etter tur, og varsler find
. Du bør se et varsel som
xargs: grep: terminated by signal 13
som bekrefter dette.
Kommentarer
- +1 for forklaring og alternativ, selv om det andre svaret virker mer elegant for meg, siden det er mer selvforsynt
Svar
For å gjøre dette uten å bytte verktøy: (Jeg elsker 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 aldri at xargs ville ha slike muligheter for multitasking – takk for andre kommentarer også! 🙂