Próbuję znaleźć sposób na przeskanowanie całego systemu Linux w poszukiwaniu wszystkich plików zawierających określony ciąg tekstu. Dla wyjaśnienia szukam tekstu w pliku, a nie w nazwie pliku.
Kiedy szukałem, jak to zrobić, dwukrotnie natknąłem się na to rozwiązanie:
find / -type f -exec grep -H 'text-to-find-here' {} \;
Jednak to nie działa. Wygląda na to, że wyświetla każdy pojedynczy plik w systemie.
Czy to blisko właściwego sposobu na zrobienie tego? Jeśli nie, jak powinienem? Ta możliwość znajdowania ciągów tekstowych w plikach byłaby niezwykle przydatna w przypadku niektórych projektów programistycznych, które wykonuję.
.
między innymi jako jednoznaczny znak wieloznaczny. Radzę zawsze używać fgrep lub egrep.-H
z-l
(a możegrep
zfgrep
). Aby wykluczyć pliki o określonych wzorcach nazw, których użyłbyśfind
w bardziej zaawansowany sposób. Warto jednak nauczyć się obsługiwaćfind
. Właśnieman find
.find … -exec <cmd> +
jest łatwiejszy do pisania i szybszy niżfind … -exec <cmd> \;
. Działa tylko wtedy, gdy<cmd>
akceptuje dowolną liczbę argumentów nazwy pliku. Oszczędność czasu wykonania jest szczególnie duża, jeśli<cmd>
uruchamia się powoli, jak skrypty Python lub Ruby.grep "pattern" path/*.txt
Odpowiedzi:
Wykonaj następujące czynności:
-r
lub-R
jest rekurencyjny,-n
jest numerem wiersza i-w
oznacza dopasowanie całego słowa.-l
(małe litery L) można dodać, aby podać nazwę pasujących plików.Wraz z tymi,
--exclude
,--include
,--exclude-dir
flagi mogą być wykorzystane do efektywnego poszukiwania:Przeszukuje tylko te pliki, które mają rozszerzenia .c lub .h:
Wyklucza to wyszukiwanie wszystkich plików z rozszerzeniem .o:
W przypadku katalogów można wykluczyć określony katalog (y) za pomocą
--exclude-dir
parametru. Na przykład wyklucza to katalog dir1 /, dir2 / i wszystkie pasujące do * .dst /:Działa to dla mnie bardzo dobrze, aby osiągnąć prawie taki sam cel jak twój.
Aby uzyskać więcej opcji, sprawdź
man grep
.źródło
r
opcja jest leniwa (najpierw przechodzi w głąb głębi, potem zatrzymuje się po pierwszym katalogu), podczas gdyR
jest zachłanna (poprawnie przejdzie całe drzewo).R
plr
będzie poprawnie przechodził przez katalogi, aleR
będzie podążał za dowiązaniami symbolicznymi.Możesz użyć
grep -ilR
:i
oznacza ignoruj wielkość liter (opcjonalnie w twoim przypadku).R
oznacza rekurencyjny.l
oznacza „pokaż nazwę pliku, a nie sam wynik”./
oznacza rozpoczęcie od katalogu głównego komputera.źródło
-i
wynika , że powoduje to spowolnienie, więc nie używaj go, jeśli nie jest to konieczne. Przetestuj to w określonym katalogu, a następnie uogólnij. Należy go ukończyć w ciągu kilku minut. Myślę, że wyrażenie regularne spowolniłoby to. Ale moje komentarze opierają się na przypuszczeniach, sugeruję przetestowanie gotime
przed linią./*
oznacza to. W każdym razie właśnie go przetestowałem i zauważyłem, że to po prostu/
działa.fgrep is the same as grep -F -> Interpret PATTERN as a list of fixed strings
.grep -Ril "text-to-find-here" ~/sites/
lub użyć. dla bieżącego katalogugrep -Ril "text-to-find-here" .
Możesz użyć ack . To jest jak grep dla kodu źródłowego. Za jego pomocą możesz przeskanować cały system plików.
Po prostu zrób:
W twoim katalogu głównym.
Możesz także użyć wyrażeń regularnych , określić typ pliku itp.
AKTUALIZACJA
Właśnie odkryłem Srebrnego Poszukiwacza , który jest podobny do potwierdzenia, ale 3-5 razy szybszy od niego, a nawet ignoruje wzorce z
.gitignore
pliku.źródło
Możesz użyć:
r
Oznacza rekurencyjne i tak będzie szukać w podanej ścieżce, a także jego podkatalogów. To powie ci nazwę pliku, a także wydrukuje wiersz w pliku, w którym pojawia się ciąg.Lub polecenie podobne do tego, którego próbujesz (przykład:) do wyszukiwania we wszystkich plikach javascript (* .js):
Spowoduje to wydrukowanie wierszy w plikach, w których pojawia się tekst, ale nie wydrukuje nazwy pliku.
Oprócz tego polecenia możemy również napisać: grep -rn "Ciąg do przeszukania" / ścieżka / do / katalogu / lub / file -r: wyszukiwanie rekurencyjne n: numer wiersza zostanie wyświetlony dla dopasowań
źródło
Możesz użyć tego:
źródło
Lista nazw plików zawierających dany tekst
Po pierwsze, uważam, że użyłeś
-H
zamiast-l
. Możesz także spróbować dodać tekst w cudzysłowie, a następnie{} \
.Przykład
Załóżmy, że szukasz plików zawierających określony tekst „Licencja Apache” w swoim katalogu. Wyświetli wyniki nieco podobne do poniższych (wyniki będą różne w zależności od zawartości katalogu).
Usuń wrażliwość na wielkość liter
Nawet jeśli nie podoba Ci się przypadek taki jak „tekst” a „TEKST”, możesz użyć
-i
przełącznika, aby zignorować wielkość liter. Możesz przeczytać dalsze szczegóły tutaj .Mam nadzieję, że to ci pomoże.
źródło
find
przekaże wszystkie znalezione ścieżki do poleceniagrep -l "text-to-find-here" <file found>"
. Możesz dodać ograniczenia do nazwy pliku, np.find / -iname "*.txt"
Aby wyszukiwać tylko w plikach, których nazwa kończy się na.txt
-iname
nie rozróżnia wielkości liter, co oznacza, że znajdzie również pliki .TXT, na przykład, a także TxT i TXt i tak dalej.grep
( GNU lub BSD )Możesz użyć
grep
narzędzia do rekurencyjnego przeszukiwania bieżącego folderu, takiego jak:Uwaga:
-r
- Rekurencyjnie przeszukuj podkatalogi.Możesz także użyć składni globowania do wyszukiwania w określonych plikach, takich 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 także 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 szczycie regex silnika 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
Jeśli
grep
nie obsługuje wyszukiwania rekurencyjnego, możesz połączyćfind
zxargs
:Uważam to za łatwiejsze do zapamiętania niż format
find -exec
.Spowoduje to wyświetlenie nazwy pliku i zawartości dopasowanego wiersza, np
Opcjonalne flagi, które możesz dodać do
grep
:-i
- wyszukiwanie bez rozróżniania wielkości liter-l
- wypisuje tylko nazwę pliku, w którym znaleziono dopasowanie-h
- wypisuje tylko pasujący wiersz (nie nazwę pliku)źródło
grep 'text-to-find-here'
bez nazwy pliku, jeślifind
niczego nie znajdzie. To się zawiesi i zaczeka na dane wejściowe użytkownika! Dodaj--no-run-if-empty
jako opcję doxargs
.find … -exec grep … +
. Jeśli nalegasz na używanie find razem z xargs, użyj-print0
i-0
.i
: Zignoruj rozróżnienie wielkości liter zarówno w WZORZE, jak i plikach wejściowych.n
: Poprzedź każdą linię wyjścia numerem linii na podstawie 1 w swoim pliku wejściowym.s
: Pomiń komunikaty o błędach dotyczące nieistniejących lub nieczytelnych plików.r
: Rekurencyjnie czytaj wszystkie pliki w każdym katalogu.źródło
Istnieje nowe narzędzie o nazwie The Silversearcher
Działa ściśle z Git i innymi VCS. Więc nic nie dostaniesz w .git lub innym katalogu.
Możesz po prostu użyć
I zrobi to za Ciebie!
źródło
W przypadku korzystania find jak w przykładzie, lepiej dodać
-s
(--no-messages
) w celugrep
i2>/dev/null
na końcu polecenia do wielu Unikać Permission denied komunikaty wydawane przezgrep
ifind
:find jest standardowym narzędziem do wyszukiwania plików - w połączeniu z grep podczas wyszukiwania określonego tekstu - na platformach typu Unix. Find polecenie jest często w połączeniu z xargs , tak przy okazji.
Istnieją szybsze i łatwiejsze narzędzia do tego samego celu - patrz poniżej. Lepiej je wypróbuj, pod warunkiem, że są one dostępne na twojej platformie , oczywiście:
Szybsze i łatwiejsze alternatywy
RipGrep - najszybsze narzędzie wyszukiwania:
Srebrny Poszukiwacz :
ack :
Uwaga: Możesz również dodać
2>/dev/null
do tych poleceń, aby ukryć wiele komunikatów o błędach.Ostrzeżenie : chyba że naprawdę nie możesz tego uniknąć, nie wyszukuj z '/' (katalogu głównego), aby uniknąć długiego i nieefektywnego wyszukiwania! Dlatego w powyższych przykładach lepiej zastąpić „ / ” nazwą podkatalogu, np. „/ Home”, w zależności od tego, gdzie faktycznie chcesz wyszukać ...
źródło
grep
find
nie przeszukuje bezpośrednio plików wewnątrz tekstu. I może te dodatkowe narzędzia są przydatne dla niektórych, ale starych timerów, a ci, do których są przyzwyczajeni, np. Wgrep
ogóle nie dadzą im czasu (cóż, na pewno nie zrobię tego). Nie mówię jednak, że są bezużyteczne.fol
? Nie, oczywiście nie; został nazwanydir
(i wierzę, że nadal tak jest). Folder jest zaprojektowany dla (jak sądzę) przyjazności dla użytkownika, chociaż w tym przypadku może być głupszy dla mniej „zaawansowanych” użytkowników?Próbować:
źródło
xargs
. Rozważ to.echo "file bar.txt has bar" > bar.txt; echo "file foo bar.txt has foo bar" > "foo bar.txt"; echo "You should never see this foo" > foo; find . -name "*.txt" | xargs grep -i foo # ./foo:You should never see this foo
.xargs
Tutaj dopasowany plik źle i nie pasuje do zamierzonego pliku. Albo użyjfind .. -print0 | xargs -0 ...
ale, ale to bezużyteczne użycie fajki lub lepiejfind ... -exec grep ... {} +
Służy
pwd
do wyszukiwania z dowolnego katalogu, w którym się znajdujesz, powtarzając w dółAktualizacja W zależności od używanej wersji grep możesz pominąć
pwd
. W nowszych wersjach.
wydaje się, że domyślnym przypadkiem grep jest brak katalogu:grep -rnw -e "pattern"
lub
grep -rnw "pattern"
zrobi to samo co powyżej!
źródło
pwd
nie jest wcale konieczne, ponieważ jest to ustawienie domyślne.grep -rnw "pattern"
wystarczy.grep -rnw
to samo pytanie udzielono trzy lata temu, nie rozumiem, w jaki sposób ta odpowiedź stanowi wartość dodaną.grep -rnw '/path/to/somewhere/' -e "pattern"
to, co masz tutaj. 5 głosów po 2,3 mln wizyt nie znaczy tak wiele.grep
można użyć, nawet jeśli nie szukamy łańcucha.Po prostu działa,
wypisze ścieżkę do wszystkich plików tekstowych, tj. zawierających tylko znaki do wydrukowania.
źródło
ls
lubfind
(dla rekurencyjnego)Oto kilka list poleceń, których można użyć do wyszukiwania pliku.
źródło
egrep
jest równoważnegrep -E
i oznacza,--extended-regexp
że możesz znaleźć szczegóły tutaj unix.stackexchange.com/a/17951/196072Silver Searcher to wspaniałe narzędzie, ale ripgrep może być jeszcze lepszy.
Działa na systemach Linux, Mac i Windows, a kilka miesięcy temu został napisany w Hacker News (link do bloga Andrew Gallanta, który zawiera link GitHub):
Ripgrep - Nowe narzędzie do wyszukiwania z wiersza poleceń
źródło
Wyjaśnienie z 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.
źródło
Próbować:
który przeszuka wszystkie systemy plików, ponieważ
/
jest to folder główny.Do użytku w folderze domowym:
Do bieżącego folderu użyj:
źródło
Mam nadzieję, że to pomoże ...
Rozwijając
grep
nieco, aby uzyskać więcej informacji w danych wyjściowych, na przykład, aby uzyskać numer wiersza w pliku, w którym znajduje się tekst, można wykonać w następujący sposób:A jeśli masz pojęcie, jaki jest typ pliku, możesz zawęzić wyszukiwanie, określając rozszerzenia typów plików do wyszukania, w tym przypadku
.pas
LUB.dfm
pliki:Krótkie wyjaśnienie opcji:
.
wfind
określa z bieżącego katalogu.-name
„*.*
”: Dla wszystkich plików (-name „*.pas
” -o -name „*.dfm
”): Tylko*.pas
LUB*.dfm
plików lub określony z-o
-type f
określa, że szukasz plików-print0
a--null
po drugiej stronie|
(potoku) są najważniejsze, przekazując nazwę pliku zfind
dogrep
osadzonego wxargs
, umożliwiając przekazywanie nazw plików ze spacjami w nazwach plików, pozwalając grepowi traktować ścieżkę i nazwę pliku jako jeden ciąg, i nie rozbijaj go na każdym polu.źródło
-name '*.*'
nie jest tym, co mówisz; nie przechwyciłby pliku o nazwie „plik”, ponieważ wzorzec nie jest z nim zgodny (brak .ext);*
zrobiłby jednak (oprócz plików. na bok). Ale jest jeszcze jedna rzecz: jeśli chcesz wszystkie pliki, po co zawracać sobie głowę określaniem nazwy pliku? Żadnego innego komentarza - poza tym, że miło jest wiedzieć, że wciąż są ludzie, którzy nie używają terminologii MS „folder” (który tak naprawdę po powiedzeniu tego wystarczająco dużo nie dodałbym, ale chciałem zwrócić uwagę na nieco niepoprawne stwierdzenie, które wypowiedziałeś z nazwami plików - a także nadmiarowością / bezużytecznością w przypadku „wszystkich”).Prosty
find
może się przydać. alias w twoim~/.bashrc
pliku:Uruchom nowy terminal i wydaj:
źródło
Napisałem skrypt w języku Python, który robi coś podobnego. Tak należy używać tego skryptu.
Pierwszym argumentem
path
jest katalog, w którym będziemy przeszukiwać rekurencyjnie. Drugi argument,pattern_to_search
to wyrażenie regularne, które chcemy wyszukać w pliku. Używamy formatu wyrażeń regularnych zdefiniowanych w bibliotece Pythonre
. W tym skrypcie.
również pasuje do znaku nowej linii.Trzeci argument
file_pattern
, jest opcjonalny. To kolejne wyrażenie regularne, które działa na nazwie pliku. Uwzględnione zostaną tylko te pliki, które pasują do tego wyrażenia regularnego.Na przykład, jeśli chcę wyszukiwać pliki Pythona z rozszerzeniem
py
zawierającymPool(
następujące po nim słowoAdaptor
, wykonuję następujące czynności,I voila, generuje ścieżkę dopasowanych plików i numer linii, przy której znaleziono dopasowanie. Jeśli znaleziono więcej niż jedno dopasowanie, każdy numer wiersza zostanie dołączony do nazwy pliku.
źródło
Jeśli chcesz używać,
find
użyjfind + grep
:find /path/to/somewhere/ -type f -exec grep -nw 'textPattern' {} \;
kroki:
1. Użyj
find
do wyszukiwania plików, 2.Następnie uruchom
grep
je wszystkie.To daje moc
find
wyszukiwania plików.Użyj,
-name Pattern
jeśli chceszgrep
tylko niektóre pliki:find /path/to/somewhere/ -type f -name \*.cpp -exec grep -nw 'textPattern' {} \;
Możesz z nim grać i korzystać z różnych opcji
find
usprawnienia lub zawężenia wyszukiwania plików.źródło
Posługiwać się:
Spowoduje to podanie liczby kopii wzorca w każdym z plików w bieżącym katalogu.
źródło
grep jest twoim dobrym przyjacielem, aby to osiągnąć.
Jeśli nie zależy Ci na wielkości tekstu, który chcesz znaleźć, użyj:
źródło
-
w ciągu wyszukiwania są jakieś s, najpierw musisz przekazać--
grep; które w przeciwnym razie mogą powodować ciekawe skutki uboczne!Fascynuje mnie to, jak prosty grep robi to z „rl”:
Działa idealnie ...
źródło
.txt
). Czy jest na to sposób?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
find … -exec grep 'str' {} \;
(jeśli musiszfind
w ogóle używać ).find
zawarte spacje .. mógł spowodowaćgrepping
nieprawidłowe pliki i / lub całkowity brak odpowiednich plików. Po prostu użyj,find ... -exec grep ...
jeśli musisz użyćfind
... ale w tym przypadkugrep -r ...
wystarczy.Istnieje
ack
narzędzie, które zrobiłoby dokładnie to, czego szukasz.http://linux.die.net/man/1/ack
Możesz zignorować
-i
wyszukiwanie z rozróżnianiem wielkości literźródło
Wszystkie poprzednie odpowiedzi sugerują grep i find. Ale jest inny sposób: użyj Midnight Commander
Jest to darmowe narzędzie (30 lat, sprawdzone przez czas), które jest wizualne bez GUI. Ma mnóstwo funkcji, a wyszukiwanie plików to tylko jedna z nich.
źródło
Poniższe polecenie będzie działać dobrze dla tego podejścia:
źródło
find
a następniegrep -r
? Są przeznaczone do tego samego, więc jest to zbędne.find
.Unikaj kłopotów i zainstaluj ack-grep. Eliminuje to wiele problemów związanych z pozwoleniami i ofertami.
Następnie przejdź do katalogu, który chcesz przeszukać, i uruchom poniższe polecenie
źródło