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