Znajdowanie plików, które zawierają określony ciąg znaków za pomocą find (1) i grep (1)
find . -type f -print -exec cat {} \; | grep some string
Powyższa komenda nie drukuje ścieżki do pliku.
Używam: Ubuntu, bash 4
.
find . -type f -print -exec cat {} \; | grep some string
Powyższa komenda nie drukuje ścieżki do pliku.
Używam: Ubuntu, bash 4
.
Używam
grep "some string" . -R
i działa to szybciej
p.s.
Bardziej złożony przypadek użycia
grep -HiRE "some string|other string" . #H for file printing, i for case-insensitive, R for recursive search, E for regex
Aby odczytać param i wyjaśnienie
grep --help | grep -- -i
```.
Dzieje się tak dlatego, że podajesz grep
strumień tekstu, który tak się składa, że zawiera nazwy plików. Ponieważ nie podałeś żadnych nazw plików jako argumentów grepowi, nie można oczekiwać, że wywnioskuje on, z jakiego pliku pochodzi dopasowana linia. Użyj xargs
:
find . -type f -print | xargs grep "some string"
Ponieważ masz GNU find/xargs, jest to bezpieczniejszy sposób, aby xargs czytał nazwy plików:
find . -type f -print0 | xargs -0 grep "some string"
Jeśli chcesz tylko nazwy plików, które mają pasującą linię, bez pokazywania pasującej linii:
find . -type f -print0 | xargs -0 grep -l "some string"
```.
Często szukam kodu źródłowego w złożonych strukturach folderów i przydaje mi się użycie:
cd /your/folder/
grep -rHino "your string"
Z tymi parametrami, bez użycia find, otrzymuję pełną ścieżkę do pliku oraz numer linii, która zawiera określony ciąg znaków.
Jest to również łatwe do zapamiętania, ponieważ BASHes przez wyszukiwanie jak rHino :)
Pokażę jak to działa na krótkim przykładzie.
Wyświetlmy zawartość pliku używając cat:
jeeves ~ # cat fw.stop
#!/bin/sh
echo "Stopping firewall and allowing everyone..."
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT
I wyszukajmy rekursywnie wszystkie pliki zawierające ciąg “iptables -P”:
jeeves ~ # grep -rinHo "iptables -P"
fw.stop:9:iptables -P
fw.stop:10:iptables -P
fw.stop:11:iptables -P
Jak widać na wyjściu mamy filename:hit row:searched string
Oto dokładniejszy opis użytych parametrów:
-r Dla każdego operandu katalogu, odczytaj i przetwórz wszystkie pliki w tym katalogu, rekurencyjnie. Podążaj za dowiązaniami symbolicznymi w wierszu poleceń, ale pomijaj dowiązania, które są napotykane rekurencyjnie. Zauważ, że jeśli nie podano operandu plik, grep przeszukuje katalog roboczy. Jest to to samo co opcja ‘–directories=recurse’.
-i Wypisuje nazwę pliku dla każdego dopasowania. Jest to wartość domyślna, gdy jest więcej niż jeden plik do przeszukania.
-n Przedrostek każdej linii wyjściowej numerem linii w pliku wejściowym, liczonym od 1. (-n jest określone przez POSIX.)
-H Wypisuje nazwę pliku dla każdego dopasowania. Jest to wartość domyślna, gdy do przeszukania jest więcej niż jeden plik.
-o Drukuje tylko dopasowane (niepuste) części pasujących linii, z każdą taką częścią w osobnej linii wyjściowej. Linie wyjściowe używają tych samych ograniczników co wejściowe, a ogranicznikami są bajty zerowe, jeśli użyto również -z (–null-data) (zobacz Inne opcje).
Wolałem
| znajdź plik |make grep ont finding file | show de full path of the file
find / -type f -exec grep ‘some string’ {} \; -exec echo {} \;;
Silver Searcher ](https://github.com/ggreer/the_silver_searcher) jest bardzo szybkim i poręcznym narzędziem do wyszukiwania plików i treści.
Aby rozwiązać twój problem, komenda silver searcher wyglądałaby tak…
ag 'some string' -l
-l
Wypisuje tylko nazwy plików, które zawierają dopasowania (nie wypisuje pasujących linii)