Možná je to trochu divné – a možná existují i jiné nástroje, jak to udělat, ale dobře ..

Používám následující klasický příkaz bash k vyhledání všech souborů, které obsahují nějaký řetězec:

find . -type f | xargs grep "something" 

Mám velké množství souborů ve více hloubkách . první výskyt „něčeho“ mi stačí, ale hledání pokračuje v hledání a dokončení zbývajících souborů trvá dlouho. To, co bych chtěl udělat, je něco jako „zpětná vazba“ od grep zpět k nalezení, aby find může přestat hledat další soubory. Je něco takového možné?

Odpovědět

Jednoduše jej udržujte v říši nálezu:

find . -type f -exec grep "something" {} \; -quit 

Takto to funguje:

-exec bude fungovat, když -type f bude pravda. A protože grep vrací 0 (success / true), když má shodu, spustí se -quit.

Odpověď

find -type f | xargs grep e | head -1 

dělá přesně to: když je head ukončen, prostřední prvek kanálu je upozorněn„ přerušeným potrubím “ „signál, postupně končí a upozorňuje find. Mělo by se zobrazit upozornění, jako je

xargs: grep: terminated by signal 13 

, které to potvrzuje.

Komentáře

  • +1 pro vysvětlení a alternativu, i když se mi druhá odpověď zdá elegantnější, protože je soběstačnější

Odpověď

To provedete beze změny nástrojů: (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 

Komentáře

  • +1 nikdy nevěděl, že xargs bude mít takové možnosti multitaskingu – děkujeme také za další komentáře! 🙂

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *