Chcę znaleźć wszystkie pliki, które zawierają określony ciąg tekstu. grep
Komenda działa, ale nie wiem, jak go używać na każdym katalogu (mogę tylko zrobić dla mojego bieżącego katalogu). Próbowałem czytać man grep
, ale nie pomogło.
command-line
grep
Smile.Hunter
źródło
źródło
--include="*.C"
Symbol wieloznaczny z opcją @ user311346, dzięki @Lekensteyn.Odpowiedzi:
Lepiej byłoby użyć
gdzie
-r
--recursive
Opcja (lub ) służy do przeglądania również wszystkich podkatalogów/path
, natomiast-l
--files-with-matches
Opcja (lub ) służy do drukowania tylko nazw plików pasujących plików, a nie pasujących linii (może to również poprawić szybkość, biorąc pod uwagę, żegrep
przestanie czytać plik przy pierwszym dopasowaniu z tą opcją).źródło
-rlF
przełączników-F
dla „ustalonego ciągu” (a nie regexp - na przykład). Oczywiście, jeśli zadanie używało wyrażeń regularnych, to przepraszam. Jasne, ta sama teoria bez -r też często widzę, że ludzie zakładają, że grep wyszukuje „tekst” i może powodować problemy, które specjalne, które oznaczają coś jako wyrażenie regularne.-i
flaga, która ignoruje wielkość liter.--recursive
opcję, jest mnóstwo opcji i scenariuszy użytkowania, o których można mówić. Zacząłem od @dmityugov zaakceptował odpowiedź i zmodyfikowałem do pracy bezfind
.--include '*.h'
Jeśli szukasz linii pasujących do plików, moim ulubionym poleceniem jest:
-H
powoduje wydrukowanie nazwy pliku (domyślnie przy wyszukiwaniu wielu plików)-r
wykonuje wyszukiwanie rekurencyjne-n
powoduje wydrukowanie numeru liniipath/to/files
może być.
wyszukiwanie w bieżącym kataloguInne opcje, które uważam za bardzo przydatne:
-I
ignoruj pliki binarne (uzupełnienie:-a
traktuj wszystkie pliki jak tekst)-F
traktujsearch term
jako wyrażenie dosłowne, a nie regularne-i
wykonaj wyszukiwanie bez rozróżniania wielkości liter--color=always
aby wymusić kolory nawet podczas przepuszczanialess
. Aby utworzyćless
kolory pomocnicze, musisz użyć-r
opcji:--exclude-dir=dir
przydatne do wykluczania katalogów takich jak.svn
i.git
.źródło
-H
folder jest redundantny, jeśli istnieje więcej niż jeden plik, co jest prawdopodobne. W rzeczywistości strona-H, --with-filename: Print the file name for each match. This is the default when there is more than one file to search.
--include '*.*'
grep --exclude='*~' ...
Wierzę, że możesz użyć czegoś takiego:
Wyjaśnienie na podstawie komentarzy
find
to polecenie, które pozwala znaleźć pliki i inne obiekty, takie jak katalogi i łącza w podkatalogach danej ścieżki. Jeśli nie określisz maski, którą nazwy plików powinny spełniać, wyliczy wszystkie obiekty katalogu.-type f
określa, że powinien przetwarzać tylko pliki, a nie katalogi itp.-exec grep
określa, że dla każdego znalezionego pliku należy uruchomić polecenie grep, przekazując mu nazwę pliku jako argument, zastępując{}
go nazwą plikuźródło
-name '*.py'
ogranicza dopasowania do plików z rozszerzeniem „.py”.... -exec bash -c 'grep -r "mystring" {} && echo {}' \;
Moje domyślne polecenie to
Używam kapitolu „R”, ponieważ
ls
używa go do rekurencji. Ponieważ grep akceptuje oba, nie ma powodu, aby go nie używać.EDYCJA: na HVNSweeting, najwyraźniej
-R
będzie podążać za dowiązaniami symbolicznymi, gdzie-r
nie będzie.źródło
shopt -s dotglob
(pamiętaj-s
jako „ustaw”). Zachowaj ostrożność podczas usuwania plików. Jeśli masz włączoną funkcję dotglob,rm -r *
usuwa wszystko w bieżącym katalogu , ale także katalog nad nim, ponieważ..
pasuje. Aby wyłączyć dotglob, użyjshopt -u dotglob
(„unset”). Zmiany są jednak tymczasowe, dotyczą tylko bieżącej powłoki.shopt -s dotglob & <grep cmd> & shopt -y dotglob
tylko wygodniejszego? W ten sposób nie będziemy musieli się martwić o jego zresetowaniegrep -Rin string .
w większości tych przypadków. Po prostu używam *, ponieważ wydaje się, że jest to bardziej naturalne.R
będzie podążać za dowiązaniami symbolicznymi,r
a nieJeśli chcesz spróbować czegoś nowego, spróbuj
ack
. Polecenie rekurencyjnego przeszukiwania bieżącego katalogustring
to:Instalacja jest dość prosta:
(Pod warunkiem, że masz już katalog,
~/bin
a najlepiej w twoimPATH
.)źródło
chmod
polecenia? Czy są one specyficznechmod
lub związane z bash (!#:3
część)?!
jest oznaczeniem wydarzenia . Są dość potężne, aby uniknąć powtórzeń.!#:3
odwołuje się do trzeciego tokena wiersza poleceń, tj.~/bin/ack
w tym przypadku.Polecenie rgrep jest dedykowane do takiej potrzeby
Jeśli nie jest dostępny, możesz to zrobić w ten sposób
Możesz bezpośrednio ustawić domyślne opcje grep, jak opisano powyżej.
Osobiście używam
powiązany temat: jak zawsze używać rgrep z kolorem
źródło
Aktualizacja 2:
Ta linia poleceń używa
find
igrep
rozwiązuje problem:--color=<always or auto>
dla kolorowych wydruków:Przykład:
Przykład uruchom na poniższej migawce:
Aktualizacja 1:
Możesz wypróbować następujący kod; jako funkcję w swojej
.bashrc
Or.bash_aliases
lub w skrypcie:Stosowanie:
wherein /path/to/search/in/ searchkeyword
przykład:
(Uwaga: zgodnie z sugestią @enzotib w komentarzach poniżej, nie działa to z plikami / katalogami zawierającymi spacje w ich nazwach).
Oryginalny post
Aby wyszukać ciąg i wyprowadzić tylko ten wiersz z ciągiem wyszukiwania:
na przykład:
Aby wyświetlić nazwę pliku zawierającą szukany ciąg:
na przykład:
źródło
grep
, oprócz tego, że jest to podzbiór używającyfind
zgrep
... ale jeśli chcesz zaakceptować różne przełączniki i poprawki jako odrębną odpowiedź, prawdopodobnie mój też tu będzie pasował ... a może się różnisz? ostatnia aktualizacja działa tak, jak chciałbym podczas wyszukiwania: nazwy plików z wierszami z kluczem wyszukiwania i wiersz nr. też :) oraz kolorowy filtr wyjściowy i filtr błędów dla lepszej czytelności.grep
( GNU lub BSD )Możesz użyć
grep
narzędzia do rekurencyjnego przeszukiwania bieżącego folderu za pomocą-r
parametru, takiego jak:Uwaga:
-r
- Rekurencyjnie przeszukuj podkatalogi.Aby wyszukiwać w określonych plikach, możesz użyć składni globowania, takiej jak:
Uwaga: Korzystając z opcji globbing (
**
), skanuje rekursywnie wszystkie pliki z określonym rozszerzeniem lub wzorem. Aby włączyć tę składnię, uruchom:shopt -s globstar
. Możesz również użyć**/*.*
do wszystkich plików (z wyjątkiem ukrytych i bez rozszerzenia) lub dowolnego innego wzoru.Jeśli masz błąd, że Twój argument jest za długi, rozważ zawężenie wyszukiwania lub użyj
find
składni, na przykład:Alternatywnie użyj
ripgrep
.ripgrep
Jeśli pracujesz nad większymi projektami lub dużymi plikami, powinieneś użyć
ripgrep
, takich jak:Zapoznaj się z dokumentacją, krokami instalacji lub kodem źródłowym na stronie projektu GitHub .
To znacznie szybciej niż jakiekolwiek inne narzędzia jak GNU / BSD
grep
,ucg
,ag
,sift
,ack
,pt
lub podobny, ponieważ jest zbudowany na silniku regex Rust , który używa automatów skończonych, SIMD i agresywny dosłownych optymalizacje aby szukają bardzo szybko.Obsługuje wzorce ignorowania określone w
.gitignore
plikach, więc pojedynczą ścieżkę pliku można dopasować do wielu wzorców globu jednocześnie.Możesz użyć wspólnych parametrów, takich jak:
-i
- Niewrażliwe wyszukiwanie.-I
- Zignoruj pliki binarne.-w
- Wyszukaj całe słowa (w przeciwieństwie do częściowego dopasowywania słów).-n
- Pokaż linię swojego meczu.-C
/--context
(np.-C5
) - Zwiększa kontekst, dzięki czemu widzisz otaczający kod.--color=auto
- Zaznacz pasujący tekst.-H
- Wyświetla nazwę pliku, w którym znajduje się tekst.-c
- Wyświetla liczbę pasujących linii. Można łączyć z-H
.źródło
Robię to za pomocą xargs, bardzo niedocenianego polecenia
find ./ daje ci rekurencyjną listę wszystkich plików w bieżącym folderze, a następnie potokujesz ją do xargs, który wykonuje polecenie grep na każdym z tych plików
źródło
xargs
bez-print0
opcji dofind
i-0
opcjaxargs
jest przestarzałe, nie powiedzie się w nazwach plików zawierających spacje.Wiem, że jest tu wiele odpowiedzi, ale oto alternatywa, jeśli chcesz dodać inne ograniczenia podczas wyszukiwania plików:
Działa to, ponieważ
grep
zwróci 0, jeśli znajdzie wynik, 1 w przeciwnym razie. Na przykład możesz znaleźć pliki o wielkości 1 MB i zawierające coś:W przypadku wielu wymagań prawdopodobnie będziesz chciał użyć flagi optymalizatora,
-O
która istnieje w GNU grep.źródło
Skrypt (find-in-code) do wyszukiwania w kodzie C, CPP:
Posługiwać się:
źródło