Pracuję nad pisaniem skryptów do grep
niektórych katalogów, ale katalogi te zawierają różnego rodzaju typy plików.
Chcę grep
po prostu .h
i .cpp
teraz, ale może kilka innych w przyszłości.
Do tej pory mam:
{ 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]
Czy ktoś może mi pokazać, jak teraz dodam tylko określone rozszerzenia plików?
grep -r -i CP_Image ~/path1/*.{h,cpp}
?ag -i CP_Image ~/path[1-5] | mailx -s GREP [email protected]
. Zadanie wykonane.-r
abygrep
wyszukiwać pliki, ponieważ łamie to mantrę UNIX dotyczącą posiadania narzędzi, które „robią jedną rzecz i robią to dobrze”. Istnieje doskonale dobre narzędzie do wyszukiwania plików o BARDZO oczywistej nazwie.Odpowiedzi:
Wystarczy użyć
--include
parametru, jak poniżej:to powinno robić, co chcesz.
Aby wziąć wyjaśnienie z odpowiedzi HoldOffHunger poniżej:
grep
: Komenda-r
: rekurencyjnie-i
: ignoruj wielkość liter--include \*.cpp
: wszystkie pliki * .cpp: C ++ (ucieczka z \ na wypadek, gdybyś miał katalog z gwiazdkami w nazwach plików)./
: Rozpocznij od bieżącego katalogu.źródło
grep -r -i --include \*.h --include \*.cpp CP_Image ~/path[12345]
grep -r -i --include="*.h" --include="*.cpp" CP_Image
Niektóre z tych odpowiedzi wydawały się zbyt obszerne pod względem składni lub powodowały problemy na moim serwerze Debian. To działało idealnie dla mnie:
Rewolucja PHP: Jak grepować pliki w systemie Linux, ale tylko niektóre rozszerzenia plików?
Mianowicie:
... lub wersja bez rozróżniania wielkości liter ...
grep
: Komenda-r
: rekurencyjnie-i
: ignoruj wielkość liter--include
: all * .txt: pliki tekstowe (ucieczka z \ na wypadek, gdybyś miał katalog z gwiazdkami w nazwach plików)'searchterm'
: Czego szukać./
: Rozpocznij od bieżącego katalogu.źródło
*
użyciem\*.cpp
lub'*.cpp'
. W przeciwnym razie nie da oczekiwanego rezultatu, gdy katalog roboczy zawiera niektóre*.txt
pliki.--include=<pattern>
ale ważne jest, aby uciec*
z--include <pattern>
(spacją zamiast=
), co w innym przypadku wydaje się bardzo podobne.źródło
--include
opcja jest za igłą, a nie z innymi opcjami?--
jestCo powiesz na:
źródło
-name
argumentów. dziwne rzeczy mogą się zdarzyć, jeśli tego nie zrobisz.find . \( -name '*.h' -o -name '*.cpp' \) -exec grep "CP_Image" {} \; -print
find
może opcjonalnie wiązać argumenty, ograniczając wywoływanie wywoływanego procesu do minimum.find . \( -name \*.h -o -name \*.cpp \) -exec grep -H CP_Image {} +
Jest to sugerowane, ale nie podkreślone w odpowiedzi @ fedorqui poniżej, i jest to godna uwagi poprawa.-H
Argument grep tutaj jest przydatna, gdy tylko znaleźć identyfikuje pojedynczy plik pasujący. Może to wyeliminować użycie-print
w odpowiedzi. Jeśli całkowita lista plików jest wystarczająco mała,{path1,path2}/**/*.{cpp,h}
może być zalecane użycie globu powłoki rekurencyjnej (np. ).Na serwerach HP i Sun nie ma opcji -r, w ten sposób działało dla mnie na moim serwerze HP
-i służy do wyszukiwania łańcucha bez rozróżniania wielkości liter
źródło
ll
ale go nie dodaje--color=auto
.Ponieważ jest to kwestia wyszukiwania plików, użyjmy
find
!Korzystanie GNU znaleźć można skorzystać z
-regex
opcji, aby znaleźć te pliki w drzewie katalogów, których rozszerzenie jest albo.h
albo.cpp
:Następnie wystarczy wykonać
grep
każdy z jego wyników:Jeśli nie masz takiej dystrybucji znaleziska, musisz zastosować podejście takie jak Amir Afghani , używając
-o
opcji konkatenacji opcji ( nazwa kończy się na.h
lub na.cpp
):A jeśli naprawdę chcesz użyć
grep
, postępuj zgodnie ze wskazaną składnią--include
:źródło
Najłatwiej jest
źródło
ag
(srebrny wyszukiwarka) ma na to dość prostą składnięwięc
źródło
ag _string_to_find_ -G _filename_regex_
Poniższa odpowiedź jest dobra:
Ale można zaktualizować do:
Co może być prostsze.
źródło
Powinien napisać „-exec grep” dla każdego „-o -name”
Lub pogrupuj je według ()
opcja „-Hn” pokazuje nazwę pliku i linię.
źródło
Wiem, że to pytanie jest trochę przestarzałe, ale chciałbym udostępnić metodę, której zwykle używam do znajdowania plików .c i .h :
lub jeśli potrzebujesz również numeru linii:
źródło