Talán kicsit furcsa – és lehet, hogy vannak más eszközök is erre, de hát ..
A következő klasszikus bash paranccsal keresem az összes fájlt, amely tartalmaz némi karakterláncot:
find . -type f | xargs grep "something"
Nagyon sok fájlom van, több mélységben . A “valami” első előfordulása elegendő számomra, de a keresés folytatja a keresést, és a többi fájl elkészítése hosszú időt vesz igénybe. Amit szeretnék tenni, az olyan, mint egy “visszajelzés” a grep back-től, hogy megtalálja, hogy A megtalálás leállíthatja további fájlok keresését. Lehetséges ilyen?
Válasz
Egyszerűen tartsa a keresés területén:
find . -type f -exec grep "something" {} \; -quit
Így működik:
A -exec
akkor fog működni, amikor a div id = “da7708c38d”>
igaz lesz. És azért, mert a grep
0
(siker / igaz) eredményt ad, amikor div id = “70324 b5a47 “>
egyezik, a -quit
aktiválódik.
Válasz
find -type f | xargs grep e | head -1
pontosan ezt teszi: amikor a head
befejeződik, a cső középső elemét” törött csővel “értesítik “jelzés, sorban leáll, és értesíti a find
-t. Látnia kell egy olyan értesítést, mint a
xargs: grep: terminated by signal 13
, amely ezt megerősíti.
Megjegyzések
- +1 a magyarázatért és az alternatíváért, bár a másik válasz nekem elegánsabbnak tűnik, mivel önellátóbb
Válasz
Ehhez az eszközök megváltoztatása nélkül: (Szeretem az xargs-ot)
#!/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
Megjegyzések
- A +1 soha nem tudta, hogy az xargs ilyen multitasking képességekkel rendelkezik – köszönöm a többi megjegyzést is! 🙂