Vykonajte rekurzívne vyhľadávanie Grep vo všetkých súboroch a adresároch


Všestranný príkaz grep vám umožňuje vyhľadávať text vo všetkých súboroch a všetkých podadresároch adresára. Tu je návod, ako to urobiť.

Grep je vynikajúci nástroj, keď musíte hľadať v obsahu súboru.

Zvyčajne spustíte grep na jednom súbore, ako je tento:

grep search_term filename

Grep je dosť všestranný. Ak chcete vyhľadať všetky súbory v adresári pomocou grep, použite ho takto:

grep search_term *

Je s tým problém. Vyhľadáva iba vo všetkých súboroch v aktuálnom adresári. Nebude hľadať v podadresároch.

Pomocou možnosti -r rekurzívneho vyhľadávania môžete vykonať grep vyhľadávanie vo všetkých súboroch a všetkých podadresároch aktuálneho adresára:

grep -r search_term . 

Môžete tiež zadať cestu k adresáru, ak sa nenachádzate v adresári, v ktorom chcete vykonať vyhľadávanie:

grep -r search_term directory_path

To bola rýchla rekapitulácia. Dovoľte mi, aby som vám to všetko podrobne ukázal na správnych príkladoch, aby ste to ľahšie pochopili.

Grep vyhľadáva vo všetkých súboroch adresára

Tu je adresárová štruktúra, ktorú použijem v tomto príklade. Všetky súbory okrem empty.txt obsahujú výraz 'simple', na ktorom vykonám vyhľadávanie grep.

abhishek@LHB:~/scripts$ tree
.
├── dir1
│   └── new_script.sh
├── dir2
│   └── your_script.sh
├── dir3
│   ├── empty.txt
│   └── linked.txt -> ../../sample.txt
├── my_script.sh
└── your_script.sh

3 directories, 6 files

Ak chcete vyhľadať slovo „jednoduchý“ vo všetkých súboroch aktuálnych adresárov, stačí použiť zástupný znak (*). Zástupný znak v skutočnosti nahrádza názov všetkých súborov a adresárov v aktuálnom adresári.

grep simple *

Toto vyhľadá všetky súbory v aktuálnych adresároch, ale nevstúpi do podadresárov. Keďže nemôžete priamo vyhľadávať grep v adresári, spolu s výsledkami vyhľadávania sa zobrazí chyba „XYZ je adresár“.

Ak sa nenachádzate v rovnakom adresári, v ktorom chcete vykonať akciu, môžete zadať cestu k adresáru a ukončiť ju znakom /*

grep search_term directory_path/*

Zástupný znak v podstate používate na rozšírenie všetkých prvkov (súborov a adresárov) daného adresára.

Teraz, keď to viete, sa pozrime, ako môžete vykonať rekurzívne vyhľadávanie pomocou grep, aby sa pozrel aj do súborov v podadresároch.

Grep rekurzívne vyhľadávanie vo všetkých podadresároch adresára

Grep poskytuje možnosť -r pre rekurzívne vyhľadávanie. Pri tejto možnosti sa grep pozrie do všetkých súborov v aktuálnom (alebo špecifikovanom) adresári a tiež sa pozrie do všetkých súborov všetkých podadresárov.

Tu je rekurzívne vyhľadávanie, ktoré som vykonal v predchádzajúcom príklade, aby som vykonal vyhľadávanie grep v aktuálnom priečinku:

grep -r simple .

Tu je výsledok:

Existuje aj možnosť -R pre rekurzívne vyhľadávanie a funguje takmer rovnako ako možnosť -r.

grep -R simple .

Aký je teda rozdiel grep -r a grep -R? Vlastne len jeden. -R je dereferencované vyhľadávanie, čo znamená, že bude nasledovať symbolické odkazy na prechod na pôvodný súbor (ktorý sa môže nachádzať v inej časti systému).

Pozrite sa na výstup vyhľadávania -R v rovnakom príklade:

Všimli ste si, že poskytuje ďalší výsledok vyhľadávania s linked.txt, čo je v podstate symbolický odkaz a bol vynechaný z vyhľadávania grep s voľbou -r?

Ak sa nenachádzate v adresári, kde chcete vykonať rekurzívne vyhľadávanie, zadajte absolútnu alebo relatívnu cestu adresára príkazu grep:

grep -r search_term path_to_directory

Bonusový tip: Vylúčte určitý adresár z rekurzívneho vyhľadávania grep

Všetko sa zdá byť v poriadku, ale čo ak chcete vylúčiť určitý adresár z rekurzívneho vyhľadávania? Aj na to existuje ustanovenie. Povedal som vám, že grep je mimoriadne všestranný príkaz.

grep -r --exclude-dir=dir_name serach_term directory_path

To nie je ono. Z rekurzívneho vyhľadávania môžete vylúčiť viac ako jeden podadresár nasledujúcim spôsobom:

grep -r --exclude-dir={dir1,dir2} serach_term directory_path

Takto vyzerá vylúčenie adresárov v našom príklade tu:

A áno, ako ukazuje príklad vyššie, vylúčenie funguje s rekurzívnymi možnosťami -r aj -R.

Zhrnúť

Tu je rýchly súhrn používania grep vyhľadávania pre viacero súborov a adresárov:

grep string *

Vyhľadáva vo všetkých súboroch v aktuálnom adresári

grep string dir

Vyhľadáva vo všetkých súboroch v adresári dir

grep -r string .

Rekurzívne vyhľadávanie vo všetkých súboroch vo všetkých podadresároch

grep -r string dir

Rekurzívne vyhľadávanie vo všetkých súboroch vo všetkých podadresároch dir

grep -R string .

Rovnaké ako r, ale nasleduje symbolické odkazy

Dúfam, že sa vám tento rýchly grep tip páči. Ak chcete viac, môžete si prečítať tento podrobný návod na používanie príkazu grep:

Ak máte nejaké otázky alebo návrhy k tejto téme, dajte mi vedieť.