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

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *