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ů?
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 souboruNě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.
Co takhle:
find . -name '*.h' -o -name '*.cpp' -exec grep "CP_Image" {} \; -print
grep -rnw "some thing to grep" --include=*.{module,inc,php,js,css,html,htm} ./
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
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}
# ^^^^^^^^^^^^^^^^^^^
Nejjednodušší způsob je
find . -type f -name '*.extension' | xargs grep -i string
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 a .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"
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šší.
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>
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.