it-swarm-eu.dev

Jak najdu všechny soubory obsahující konkrétní text na Linuxu?

Snažím se najít způsob, jak prohledat celý systém Linux pro všechny soubory obsahující určitý řetězec textu. Jen abych objasnil, hledám text v souboru, ne v názvu souboru.

Když jsem hledal, jak to udělat, narazil jsem na toto řešení dvakrát:

find / -type f -exec grep -H 'text-to-find-here' {} \;

Nicméně, to nefunguje. Zdá se, že zobrazuje každý soubor v systému.

Je to blízko správného způsobu, jak to udělat? Pokud ne, jak bych měl? Tato schopnost najít textové řetězce v souborech by byla mimořádně užitečná pro některé programovací projekty, které dělám.

4457
Nathan

Udělej následující:

grep -rnw '/path/to/somewhere/' -e 'pattern'
  • -r nebo -R je rekurzivní,
  • -n je číslo řádku a
  • -w je zkratka pro celé slovo.
  • -l (malá písmena L) může být přidána, aby se zadal pouze název souboru odpovídajících souborů.

Spolu s těmito příznaky --exclude, --include, --exclude-dir by mohly být použity pro efektivní vyhledávání:

  • To bude prohledávat pouze ty soubory, které mají příponu .c nebo .h:

    grep --include=\*.{c,h} -rnw '/path/to/somewhere/' -e "pattern"
    
  • Tím vyloučíte vyhledávání všech souborů končících příponou .o:

    grep --exclude=*.o -rnw '/path/to/somewhere/' -e "pattern"
    
  • Pro adresáře je možné vyloučit určitý adresář (y) prostřednictvím parametru --exclude-dir. Tím se například vyloučí dirs dir1 /, dir2/a všechny z nich odpovídající * .dst /:

    grep --exclude-dir={dir1,dir2,*.dst} -rnw '/path/to/somewhere/' -e "pattern"
    

To pro mě funguje velmi dobře, abych dosáhl téměř stejného cíle jako vy.

Pro více možností zaškrtněte man grep.

8076
rakib_

Můžete použít grep -ilR:

grep -Ril "text-to-find-here" /
  • i označuje případ ignorování (volitelné ve vašem případě).
  • R znamená rekurzivní.
  • l znamená "zobrazit název souboru, nikoli samotný výsledek".
  • / znamená začátek v kořenovém adresáři vašeho počítače.
1279
fedorqui

Můžete použít ack . Je to jako grep pro zdrojový kód. Můžete s ním skenovat celý souborový systém.

Prostě:

ack 'text-to-find-here'

V kořenovém adresáři.

Můžete také použít regulární výrazy , určit typ souboru atd.


UPDATE

Právě jsem objevil Silver Searcher , který je jako ack, ale 3-5x rychlejší než to a dokonce ignoruje vzory ze souboru .gitignore.

283
EarlOfEgo

Můžeš použít:

grep -r "string to be searched"  /path/to/dir

r znamená rekurzivní a tak bude hledat v zadané cestě a také v jejích podadresářích. To vám řekne název souboru a vytiskne řádek v souboru, kde se řetězec objeví.

Nebo příkaz podobný tomu, který se pokoušíte (příklad:) pro vyhledávání ve všech souborech javascript (* .js):

find . -name '*.js' -exec grep -i 'string to search for' {} \; -print

To vytiskne řádky v souborech, kde se text zobrazí, ale nevytiskne název souboru.

Kromě tohoto příkazu můžeme také napsat: grep -rn "String to search"/path/to/directory/or/file -r: rekurzivní vyhledávání n: Číslo řádku se zobrazí pro shody

156
learner_19

Můžete použít toto:

grep -inr "Text" folder/to/be/searched/
98
A R

Seznam názvů souborů obsahujících daný text

V první řadě se domnívám, že jste místo -H použili -l. Můžete také zkusit přidat text do uvozovek následovaných {} \.

find / -type f -exec grep -l "text-to-find-here" {} \; 

Příklad

Řekněme, že hledáte soubory obsahující specifický text "Apache License" uvnitř vašeho adresáře. Zobrazí výsledky poněkud podobné níže (výstup bude odlišný v závislosti na obsahu vašeho adresáře).

bash-4.1$ find . -type f -exec grep -l "Apache License" {} \; 
./net/Java/jvnet-parent/5/jvnet-parent-5.pom
./commons-cli/commons-cli/1.3.1/commons-cli-1.3.1.pom
./io/swagger/swagger-project/1.5.10/swagger-project-1.5.10.pom
./io/netty/netty-transport/4.1.7.Final/netty-transport-4.1.7.Final.pom
./commons-codec/commons-codec/1.9/commons-codec-1.9.pom
./commons-io/commons-io/2.4/commons-io-2.4.pom
bash-4.1$ 

Odstraňte citlivost pouzdra

I když nepoužíváte případ jako "text" vs "TEXT", můžete použít přepínač -i k ignorování případu. Další podrobnosti zde .

Doufám, že vám to pomůže.

59
lkamal

Pokud grep nepodporuje rekurzivní vyhledávání, můžete kombinovat find s xargs:

find / -type f | xargs grep 'text-to-find-here'

Považuji to za jednodušší, než formát find -exec.

Výstupem bude název souboru a obsah odpovídající řádky, např.

/home/rob/file:text-to-find-here

Volitelné příznaky, které chcete přidat do grep:

  • -i - vyhledávání nerozlišující velká a malá písmena
  • -l - zobrazí pouze název souboru, kde byl nalezen shoda
  • -h - vydává pouze řádek, který odpovídá (nikoli název souboru)
51
RobEarl

grep ( GNU nebo BSD )

Nástroj grep můžete použít k vyhledávání rekurzivně aktuální složky, například:

grep -r "class foo" .

Poznámka: -r - Rekurzivně hledat podadresáře.

Syntaxi globbing můžete také použít k vyhledávání v rámci konkrétních souborů, například:

grep "class foo" **/*.c

Poznámka: Použitím volby globbing (**) prohledá všechny soubory rekurzivně se specifickou příponou nebo vzorem. Chcete-li tuto syntaxi povolit, spusťte: shopt -s globstar . Můžete také použít **/*.* pro všechny soubory (kromě skrytých a bez přípon) nebo jakýkoli jiný vzor.

Pokud jste zjistili, že váš argument je příliš dlouhý, zvažte zúžení vyhledávání nebo použijte syntaxi find místo toho:

find . -name "*.php" -execdir grep -nH --color=auto foo {} ';'

Alternativně použijte ripgrep .

ripgrep

Pokud pracujete na větších projektech nebo velkých souborech, měli byste místo toho použít ripgrep, například:

rg "class foo" .

Pokladna dokumentace, instalační kroky nebo zdrojový kód na stránce projektu GitHub .

Je to mnohem rychlejší než jakýkoli jiný nástroj, například GNU / BSDgrep , ucg , ag , sift , ack , pt nebo podobné, protože je postaveno na vrcholu Rustova regexového motoru který používá konečné automaty, SIMD a agresivní doslovné optimalizace pro rychlé vyhledávání.

Podporuje ignorované vzory zadané v souborech .gitignore, takže jedinou cestu k souboru lze porovnávat současně s více vzory glob.


Můžete použít společné parametry, například:

  • -i - Necitlivé vyhledávání.
  • -I - Ignorovat binární soubory.
  • -w - Vyhledávání celých slov (v protikladu k dílčím slovům).
  • -n - Zobrazí řádek vašeho zápasu.
  • -C/--context (např. -C5) - Zvyšuje kontext, takže vidíte okolní kód.
  • --color=auto - Označte odpovídající text.
  • -H - Zobrazí název souboru, kde je text nalezen.
  • -c - Zobrazí počet odpovídajících řádků. Lze kombinovat s -H.
50
kenorb
grep -insr "pattern" *
  • i: Ignorovat rozlišování písmen v souboru PATTERN a ve vstupních souborech.
  • n: Předpona pro každý řádek výstupu s číslem řádku založeným na 1 v rámci vstupního souboru.
  • s: Potlačení chybových zpráv o neexistujících nebo nečitelných souborech.
  • r: Rekurzivně číst všechny soubory v každém adresáři.
38
enfinet

Snaž se:

find . -name "*.txt" | xargs grep -i "text_pattern"
27
venkat

Jak najdu všechny soubory obsahující konkrétní text na Linuxu? (...)

Narazil jsem na toto řešení dvakrát:

find / -type f -exec grep -H 'text-to-find-here' {} \;


Pokud použijetefindjako ve vašem příkladu, přidejte -s (--no-messages) do grep a 2>/dev/null na konci příkazu, abyste se vyhnuli množstvím Oprávnění odepřených zpráv vydaných grep a find:

find / -type f -exec grep -sH 'text-to-find-here' {} \; 2>/dev/null

findje standardní nástroj pro vyhledávání souborů - v kombinaci s grepem při hledání konkrétního textu - na platformách podobných Unixu. Příkaz find je často kombinován s xargs , mimochodem.

Rychlejší a jednodušší nástroje existují pro stejný účel - viz níže. Lepší je vyzkoušet, pokud jsou na vaší platformě k dispozici, samozřejmě:

Rychlejší a jednodušší alternativy

RipGrep- nejrychlejší vyhledávací nástroj kolem:

rg 'text-to-find-here' / -l

The Silver Searcher:

ag 'text-to-find-here' / -l

ack:

ack 'text-to-find-here' / -l

Poznámka: Můžete také přidat 2>/dev/null do těchto příkazů, abyste skryli mnoho chybových zpráv.


Upozornění : pokud se tomu opravdu nemůžete vyhnout, nehledejte z '/' (kořenového adresáře) abyste se vyhnuli dlouhému a neefektivnímu vyhledávání Takže ve výše uvedených příkladech byste měli nahradit výraz „/“ názvem podadresáře, např. „/ Home“ v závislosti na tom, kde chcete skutečně hledat ... _

27
Bludzee

Existuje nový nástroj nazvaný The Silversearcher

Sudo apt install silversearcher-ag

Úzce spolupracuje s Git a dalšími VCS. Takže v adresáři .git nebo v jiném adresáři nic nedostanete.

Můžete jednoduše použít

ag -ia "Search query"

A bude to dělat za vás!

27
Neil Agarwal

Použijte pwd k vyhledání z libovolného adresáře, ve kterém se nacházíte, opakování dolů

grep -rnw `pwd` -e "pattern"

Aktualizace V závislosti na verzi grepu, kterou používáte, můžete vynechat pwd. Na novějších verzích se . jeví jako výchozí případ grepu, pokud není uveden žádný adresář:

grep -rnw -e "pattern"

nebo

grep -rnw "pattern"

udělá totéž jako výše!

26
mahatmanich

grep lze použít, i když nehledáme řetězec.

Jednoduše běží,

grep -RIl "" .

vytiskne cestu ke všem textovým souborům, tj. těm, které obsahují pouze tisknutelné znaky.

18
Alex Jasmin

Zde je několik seznamů příkazů, které lze použít k vyhledávání souborů.

grep "text string to search” directory-path

grep [option] "text string to search” directory-path

grep -r "text string to search” directory-path

grep -r -H "text string to search” directory-path

egrep -R "Word-1|Word-2” directory-path

egrep -w -R "Word-1|Word-2” directory-path
16
Atul Arvind

Jednoduchá find může pracovat šikovně. alias ve vašem souboru ~/.bashrc:

alias ffind find / -type f | xargs grep

Spuštění nového terminálu a vydání:

ffind 'text-to-find-here'
14
danglingpointer
find /path -type f -exec grep -l "string" {} \;

Vysvětlení z připomínek

find je příkaz, který vám umožní najít soubory a další objekty, jako jsou adresáře a odkazy v podadresářích dané cesty. Pokud nezadáte masku, kterou by měly splňovat názvy souborů, výčet všech objektů adresáře.

-type f specifies that it should proceed only files, not directories etc.
-exec grep specifies that for every found file, it should run grep command, passing its filename as an argument to it, by replacing {} with the filename
14
Vinod Joshi

Doufám, že se jedná o pomoc ...

Rozšíření souboru grep o více informací o výstupu, například o získání čísla řádku v souboru, kde lze text provést následujícím způsobem:

find . -type f -name "*.*" -print0 | xargs --null grep --with-filename --line-number --no-messages --color --ignore-case "searthtext"

Pokud máte představu o tom, jaký typ souboru je, můžete zúžit vyhledávání zadáním přípon typu souboru, které chcete vyhledat, v tomto případě souborů .pas OR .dfm:

find . -type f \( -name "*.pas" -o -name "*.dfm" \) -print0 | xargs --null grep --with-filename --line-number --no-messages --color --ignore-case "searchtext"

Stručné vysvětlení možností:

  1. . v find určuje z aktuálního adresáře.
  2. -name "*.*": pro všechny soubory (-name "*.pas" -o-jméno "*.dfm"): Pouze *.pas OR *.dfm soubory, OR zadané -o
  3. -type f specifikuje, že hledáte soubory
  4. -print0 a --null na druhé straně | (pipe) jsou ty klíčové, které předávají název souboru z find do grep vloženého v xargs, což umožňuje předávání jmen souborů s mezerami v názvech souborů, což umožňuje grepu zpracovat cestu a jméno souboru jako jeden řetězec, a ne rozdělit to na každém prostoru.
14
Gert van Biljon

Silver Searcher je skvělý nástroj, ale ripgrep může být ještě lepší.

Pracuje na Linuxu, Macu a Windows, a byl napsán na Hacker News před pár měsíci (to má odkaz na Andrew Gallant blog, který má GitHub odkaz):

Ripgrep - Nový vyhledávací nástroj příkazového řádku

14
AAAfarmclub

Snaž se:

find / -type f -exec grep -H 'text-to-find-here' {} \;

který bude vyhledávat ve všech souborových systémech, protože / je kořenová složka.

Pro použití v domovské složce:

find ~/ -type f -exec grep -H 'text-to-find-here' {} \;

Aktuální použití složky:

find ./ -type f -exec grep -H 'text-to-find-here' {} \;
14
user4863663

Napsal jsem Python skript který dělá něco podobného. To je, jak by měl tento skript používat.

./sniff.py path pattern_to_search [file_pattern]

První argument, path, je adresář, ve kterém budeme rekurzivně hledat. Druhý argument, pattern_to_search, je regulární výraz, který chceme hledat v souboru. Používáme formát regulárního výrazu definovaný v knihovně Pythonre. V tomto skriptu se . také shoduje s novým řádkem.

Třetí argument, file_pattern, je nepovinný. Toto je další regulární výraz, který pracuje s názvem souboru. Budou zváženy pouze ty soubory, které odpovídají tomuto regulárnímu výrazu.

Pokud například chci hledat soubory Python s příponou py obsahující Pool( následované slovem Adaptor, provedu následující:

./sniff.py . "Pool(.*?Adaptor"  .*py
./Demos/snippets/cubeMeshSigNeur.py:146 
./Demos/snippets/testSigNeur.py:259 
./python/moose/multiscale/core/mumbl.py:206 
./Demos/snippets/multiComptSigNeur.py:268 

A voila generuje cestu odpovídajících souborů a číslo řádku, na kterém byl nalezen. Pokud bylo nalezeno více než jeden zápas, pak bude každé číslo řádku připojeno k názvu souboru.

13
Dilawar

Použití:

grep -c Your_Pattern *

Tím se zobrazí, kolik kopií vašeho vzoru je v každém ze souborů v aktuálním adresáři.

12
Dr_Hope

grep je váš dobrý přítel, aby toho dosáhl.

grep -r <text_fo_find> <directory>

pokud se nestaráte o případ textu, který chcete najít, použijte

grep -ir <text_to_find> <directory>
11
Prash

Všechny předchozí odpovědi naznačují grep a najít. Ale existuje jiný způsob: Použít Midnight Commander

Jedná se o bezplatný nástroj (30 let starý, ověřený časem), který je vizuální, aniž by byl GUI. Má spoustu funkcí a hledání souborů je jen jedním z nich.

11
Peter M.

Chcete-li vyhledat řetězec a vydat právě tento řádek s vyhledávacím řetězcem:

for i in $(find /path/of/target/directory -type f); do grep -i "the string to look for" "$i"; done

např.:

for i in $(find /usr/share/applications -type f); \
do grep -i "web browser" "$i"; done

Zobrazení názvu souboru obsahujícího vyhledávací řetězec:

for i in $(find /path/of/target/directory -type f); do if grep -i "the string to look for" "$i" > /dev/null; then echo "$i"; fi; done;

např.:

for i in $(find /usr/share/applications -type f); \
do if grep -i "web browser" "$i" > /dev/null; then echo "$i"; \
fi; done;
11
user3124504

Existuje ack nástroj, který by dělal přesně to, co hledáte.

http://linux.die.net/man/1/ack

ack -i search_string folder_path/*

-i můžete ignorovat pro vyhledávání malých a velkých písmen

11
Pal

Pro tento přístup bude fungovat následující příkaz:

find ./ -name "file_pattern_name"  -exec grep -r "pattern" {} \;
10
Pradeep Goswami

Zkuste to:

find . | xargs grep 'Word' -sl
10
Tayab Hussain

Jsem fascinován tím, jak jednoduché grep to dělá s 'rl'

grep -rl 'pattern_to_find' /path/where/to/find

-r to find recursively file / directory inside directories..
-l to list files matching the 'pattern'

Použijte '-r' bez 'l' pro zobrazení názvů souborů následovaných textem, ve kterém je vzorek nalezen !

grep -r 'pattern_to_find' /path/where/to/find

Funguje perfektně.

Doufám, že to pomůže!

10
nitinr708

Můžete použít níže uvedený příkaz, protože nechcete název souboru, ale chcete hledat ze všech souborů. Zde jsem zachytit "TEXT" formulář Všechny soubory protokolu ujistěte se, že název souboru není vytištěn

grep -e TEXT *.log | cut -d' ' --complement -s -f1

volba grep s -e je poměrně rychlá ve srovnání s jinou volbou, jako je tomu u hry PATTERN

10
Mitul Patel

Vyhněte se zmatkům a nainstalujte ack-grep. To eliminuje spoustu povolení a citace otázky.

apt-get install ack-grep

Poté přejděte do adresáře, který chcete vyhledat, a spusťte příkaz níže

cd /
ack-grep "find my keyword"
10
Kareem

find s xargs je upřednostňováno, pokud existuje mnoho potenciálních shod, které by mohly projít. Běží pomaleji než jiné možnosti, ale vždy to funguje. Jak někteří objevili, xargs standardně nezpracovává soubory s vloženými mezerami. To lze překonat zadáním volby -d.

Zde je @ RobEarl odpověď, rozšířené, takže zpracovává soubory s mezerami:

find / -type f | xargs -d '\n' grep 'text-to-find-here'

Zde je odpověď @ venkat, podobně rozšířená:

find . -name "*.txt" | xargs -d '\n' grep -i "text_pattern"

Zde je @Gert van Biljon odpověď, podobně rozšířené:

find . -type f -name "*.*" -print0 | xargs -d '\n' --null grep --with-filename --line-number --no-messages --color --ignore-case "searthtext"

Zde je @ LetalProgrammer odpověď, podobně rozšířené:

alias ffind find / -type f | xargs -d '\n' grep

Zde je @Tayab Hussain odpověď, podobně rozšířené:

find . | xargs -d '\n' grep 'Word' -sl
7
Mike Slinn

Máte-li sadu souborů, které budete vždy kontrolovat, můžete jejich cesty aliasovat, například:

alias fd='find . -type f -regex ".*\.\(inc\|info\|module\|php\|test\|install\|uninstall\)"'

Potom můžete jednoduše filtrovat tento seznam takto:

grep -U -l $'\015' $(fd)

Který filtruje seznam fd na soubory, které obsahují vzor CR.

Zjistil jsem, že aliasing soubory, které mám zájem pomáhá mi vytvořit jednodušší skripty pak se vždy snaží vzpomenout, jak se dostat všechny tyto soubory. Rekurzivní věci fungují také dobře, ale dříve nebo později budete muset zápasit s odstraňováním specifických typů souborů. Což je důvod, proč jsem jen najít všechny typy souborů, které mě zajímají.

7
dkinzer

Pokud chcete použít find, pak chcete:

find /path/to/somewhere/ -type f -exec grep -nw 'textPattern' {} \;

find + grep

1.Použijte find k prohledávání souborů, 2.Při vykonání grep na všech z nich.

Lze kombinovat v jednom příkazu:

find /path/to/somewhere/ -type f -exec grep -nw 'textPattern' {} \;

  • Pokud chcete grep používat pouze určité soubory, použijte -name Pattern:

    find /path/to/somewhere/ -type f -name \*.cpp -exec grep -nw 'textPattern' {} \;

To vám dá sílu find najít soubory. Můžete s ním hrát a používat různé možnosti find ke zlepšení nebo zúžení vyhledávání souborů.

7
BreakBadSP

Zkuste to:

find / -type f -name "*" -exec grep -il "String_to_search" {} \;

Nebo

for i in /*;do grep -Ril "String_to_search" $i;done 2> /dev/null
7
VIPIN KUMAR

Použití:

grep -Erni + "text you wanna search"

Příkaz bude vyhledávat rekurzivně ve všech souborech a adresářích aktuálního adresáře a tisknout výsledek.

Poznámka: Pokud váš grep výstup není zbarvený, můžete jej změnit pomocí aliasu grep = 'grep --color = always' ve zdrojovém souboru Shell.

7
baldash

Pomocí následujících příkazů můžete najít určitý text ze souboru:

cat file | grep 'abc' | cut -d':' -f2
7
iamjayp

Jak Peter v předchozí odpovědi zmínil , všechny předchozí odpovědi naznačují grep a najít.

Existuje však sofistikovanější způsob použití Gnome Commander s dokonalýmGUIas množstvím možností od roku 2001 a hledání souborů je jen jedním z nich. Je to také bezplatný nástroj, osvědčený časem.

7
Geeocode

Zkuste to

find . -type f -name some_file_name.xml -exec grep -H PUT_YOUR_STRING_HERE {} \;
6
Sireesh Yarlagadda

Alternativní hledání GUI - pro použití na ploše:

- Vzhledem k tomu, že se otázka netýká přesně příkazů

Searchmonkey : Pokročilý nástroj pro vyhledávání souborů bez nutnosti indexování systému pomocí regulárních výrazů. Grafický ekvivalent hledání/grep. K dispozici pro Linux (Gnome/KDE/Java) a Windows (Java) - open source GPL v3

Funkce:

  • Pokročilé regulární výrazy
  • Výsledky jsou uvedeny v kontextu
  • Vyhledávání obsahující text
  • Panel pro zobrazení řádku obsahujícího text
  • Nové aktualizace 2018
  • atd.

Stáhnout - Odkazy:

.

Snímek obrazovky:

 Enter image description here

5
intika

váš příkaz je správný. Stačí přidat -l grep.

find / -type f -exec grep -l 'text-to-find-here' {} \;
0
FariZ