it-swarm-eu.dev

grep, ale pouze určité přípony souborů

Pracuji na psaní některých skriptů do grep určitých adresářů, ale tyto adresáře obsahují všechny druhy typů souborů.

Chci teď grep právě .h a .cpp, ale možná i několik dalších v budoucnu.

Zatím mám:

{ grep -r -i CP_Image ~/path1/;

grep -r -i CP_Image ~/path2/;

grep -r -i CP_Image ~/path3/;

grep -r -i CP_Image ~/path4/;

grep -r -i CP_Image ~/path5/;} 

| mailx -s GREP [email protected]

Může mi někdo ukázat, jak bych nyní přidal jen konkrétní přípony souborů?

798
Jason

Stačí použít parametr --include, jako je tento:

grep -r -i --include \*.h --include \*.cpp CP_Image ~/path[12345] | mailx -s GREP [email protected]

to by mělo dělat to, co chcete.

Poznámky k syntaxi:

  • -r - hledat rekurzivně
  • -i - case - insensitive search
  • --include=\*.${file_extension} - vyhledávají soubory, které odpovídají pouze příponě (příponám) nebo souboru
1110
Nelson

Některé z těchto odpovědí se zdály být příliš syntaxové, nebo se vyskytly problémy na mém serveru Debian. To mi perfektně fungovalo:

PHP Revoluce: Jak Grep soubory v Linuxu, ale pouze určité přípony souborů?

A to:

grep -r --include=\*.txt 'searchterm' ./

... nebo verze nerozlišující velká a malá písmena ...

grep -r -i --include=\*.txt 'searchterm' ./
  • grep: příkaz

  • -r: rekurzivně

  • -i: ignore-case

  • --include: všechny * .txt: textové soubory (únik s pouze v případě, že máte v adresářích adresář s hvězdičkami)

  • 'searchterm': Co hledat

  • ./: Spuštění v aktuálním adresáři.

234
HoldOffHunger

Co takhle:

find . -name '*.h' -o -name '*.cpp' -exec grep "CP_Image" {} \; -print
47
Amir Afghani
grep -rnw "some thing to grep" --include=*.{module,inc,php,js,css,html,htm} ./
43
Yuri Malov

Neexistuje žádná volba -r na serverech HP a Sun, což pro mě fungovalo na serveru HP

find . -name "*.c" | xargs grep -i "my great text"

-i je pro případ necitlivé hledání řetězce

15
Sam B

Protože se jedná o nález files, pojďme použít find!

Pomocí GNU můžete pomocí volby -regex najít tyto soubory ve stromu adresářů, jejichž přípona je .h nebo .cpp:

find -type f -regex ".*\.\(h\|cpp\)"
#            ^^^^^^^^^^^^^^^^^^^^^^^

Pak je to jen otázka provedení grep na každém ze svých výsledků:

find -type f -regex ".*\.\(h\|cpp\)" -exec grep "your pattern" {} +

Pokud tuto distribuci nenajdete, musíte použít přístup jako Amir Afghani's , pomocí -o ke spojení možností ( jméno je buď .h nebo .cpp)

find -type f \( -name '*.h' -o -name '*.cpp' \) -exec grep "your pattern" {} +
#            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

A pokud opravdu chcete použít grep, postupujte podle syntaxe uvedené v --include:

grep "your pattern" -r --include=*.{cpp,h}
#                      ^^^^^^^^^^^^^^^^^^^
11
fedorqui

Nejjednodušší způsob je

find . -type  f -name '*.extension' | xargs grep -i string 
7
user3640130

Jsem si vědom, že tato otázka je trochu datovaná, ale ráda bych se podělila o metodu, kterou obvykle používám k nalezení .C.h soubory:

tree -if | grep \\.[ch]\\b | xargs -n 1 grep -H "#include"

nebo také pokud potřebujete číslo řádku:

tree -if | grep \\.[ch]\\b | xargs -n 1 grep -nH "#include"
3
Tom

Níže je odpověď dobrá.

grep -r -i --include \*.h --include \*.cpp CP_Image ~/path[12345] | mailx -s GREP [email protected]

Lze však aktualizovat na:

grep -r -i --include \*.{h,cpp} CP_Image ~/path[12345] | mailx -s GREP [email protected]

Což může být jednodušší.

2
hao

ag (stříbrný hledač) má pro to docela jednoduchou syntaxi

       -G --file-search-regex PATTERN
          Only search files whose names match PATTERN.

tak

ag -G *.h -G *.cpp CP_Image <path>
2
Eldamir

Měli byste napsat "-exec grep" pro každé "-o -name"

find . -name '*.h' -exec grep -Hn "CP_Image" {} \; -o -name '*.cpp' -exec grep -Hn "CP_Image" {} \;

Nebo je seskupte podle ()

find . \( -name '*.h' -o -name '*.cpp' \) -exec grep -Hn "CP_Image" {} \;

volba '-Hn' zobrazí název souboru a řádek.

1
where23