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

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *