Chtěl bych vypsat rekurzivně a jednoznačně soubory, které dané slovo obsahují.
Příklad : Kontrola slova „check“, normálně dělám grep
$ grep check * -R
Ale protože existuje mnoho výskytů tohoto slova, mám spoustu výstupů. Musím tedy vypsat názvy souborů, které obsahují dané hledané slovo. Myslím, že by zde stačil nějaký trik s find
a xargs
, ale nejsem si jistý.
Nějaké nápady?
Odpověď
Použijte -l
nebo --files-with-matches
možnost, která je dokumentována následovně:
Potlačit normální výstup; místo toho vytiskněte název každého vstupního souboru, ze kterého by se normálně tiskl výstup. Prohledávání se zastaví při první shodě. (
-l
je specifikován POSIXem.)
Takže například můžete použít následující:
$ grep check * -lR
Komentáře
Odpověď
find . -type f -exec grep -l check {} +
Pravděpodobně nechcete použít možnost -R
, která s moderními verzemi GNU grep
při sestupném adresáři následuje symbolické odkazy. Místo toho použijte možnost -r
, která od verze 2.12 (duben 2012) již symbolické odkazy nedodržuje.
Pokud váš grep není GNU nebo je starší než verze 2.12, nebo pokud potřebujete, aby byl váš kód přenosný do systémů GNU bez krvácení, použijte find
výše uvedený příkaz.
Jinak můžete:
grep -rl check .
Nepoužívejte *
(protože by to vynechalo skryté soubory v aktuálním adresáři (a pouze v aktuálním adresáři) a způsobilo by to problémy souborům, jejichž název začíná na -
), vyhněte se předávání možnosti po argumentech, protože to není zaručeno fungoval v závislosti na prostředí a není přenosný.
Odpovědět
Zkuste toto:
find . -type f | xargs grep -c check $1 | grep -v ":0"
Pokud jde o příznaky grep
…
-c
bude vrátit název souboru následovaný: a číslem udávajícím, kolikrát se hledaný řetězec objeví v daném souboru.
-v
převezme výstup z prvního grep
hledat, filtrovat soubory s nulovými výsledky a vytisknout pouze soubory s nenulovými výsledky.
Komentáře
- Toto bude mít falešný zápor, pokud máte soubory (nebo režiséry), jejichž jména obsahují
:0
. ' Lepší jegrep -v ':0$'
. I to se udusí u cest, které obsahují nové řádky.
Odpovědět
grep -lR "text-to-find" <where-to-find>
funguje také dobře.
např. grep -lR "NAVIGATE" .
kde v .
najdeme slovo NAVIGATE
div> v aktuálním adresáři.
Odpověď
grep -rin „whatToFind“ locationToFInd
např. $ grep -rin „vihaan“.
bude rekurzivně vyhledávat a vypisovat názvy souborů a odpovídající řádky, které obsahují „vihaan“, „.“ odkazuje na aktuální adresář.
Odpověď
find . -type f | grep "keyword" *
hledat v aktuálním adresáři. Chcete-li vyhledat z kořenového adresáře, zadejte /
namísto .
Odpovědět
grep -rli trim \` find . -name *.q \`
Poskytne vám seznam souborů .q
, které obsahují klíčové slovo trim
grep -rl "text to find" "/usr/share"
a fungovalo to skvěle!