Jak v Linuxu najdu všechny soubory obsahující určitý text?

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

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

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

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

Blíží se to správnému způsobu? Pokud ne, jak bych měl postupovat? Tato schopnost vyhledávat textové řetězce v souborech by byla mimořádně užitečná pro některé programátorské projekty, které dělám.

Řešení

Proveďte následující kroky:

grep -rnw '/path/to/somewhere/' -e 'pattern'
  • -r nebo -R je rekurzivní,
  • -n je číslo řádku a
  • -w označuje přiřazení celého slova.
  • -l (malé písmeno L) může být přidáno pouze pro zadání názvu souboru, kterému odpovídá.

Spolu s nimi lze pro efektivní vyhledávání použít příznaky --exclude, --include, --exclude-dir:

  • Takto se prohledají pouze ty soubory, které mají příponu .c nebo .h:

    V případě, že se jedná o soubor s příponou .c,h, můžete použít příkaz grep --include=\*.{c,h} -rnw '/cesta/do/někde/' -e "pattern"
  • Tím se vyloučí vyhledávání všech souborů končících příponou .o:

    grep --exclude=*.o -rnw '/path/to/somewhere/' -e "pattern"
  • U adresářů je'možné vyloučit konkrétní adresář(e) pomocí parametru --exclude-dir. Například se vyloučí adresáře dir1/, dir2/ a všechny adresáře odpovídající *.dst/:

    Vyloučení adresářů: grep --exclude-dir={dir1,dir2,*.dst} -rnw '/cesta/do/někde/' -e "vzor"

Toto mi funguje velmi dobře, k dosažení téměř stejného účelu jako u vás.

Pro více možností se podívejte na man grep.

Komentáře (36)

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

grep -Ril "text-to-find-here" /
  • i znamená ignorovat případ (ve vašem případě nepovinné).
  • R znamená rekurzivní.
  • l znamená "zobrazit název souboru, ne samotný výsledek".
  • / znamená začátek v kořenovém adresáři počítače.
Komentáře (29)

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

Stačí udělat:

ack 'text-to-find-here'

V kořenovém adresáři.

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


DOPLNĚNO

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

Komentáře (3)