Chciałbym znaleźć pliki w bieżącym katalogu, które zawierają tekst „chrome”.
$ find . -exec grep chrome
find: missing argument to `-exec'
Co ja robię źle?
find: Only one instance of {} is supported with -exec ... +
-execzfind
Chciałbym znaleźć pliki w bieżącym katalogu, które zawierają tekst „chrome”.
$ find . -exec grep chrome
find: missing argument to `-exec'
Co ja robię źle?
find: Only one instance of {} is supported with -exec ... +
-execzfind
Odpowiedzi:
Przegapiłeś ;(uciekłeś tutaj, \;aby powłoka go nie interpretowała) lub a +i a {}:
find . -exec grep chrome {} \;
lub
find . -exec grep chrome {} +
findwykona się grepi zastąpi {}znalezione nazwy plików. Różnica między ;i +polega na tym, że dla każdego pliku wykonywana jest ;jedna grepkomenda, podczas gdy dla +jak największej liczby plików podano jednocześnie parametry grep.
grep -lswewnątrz konstrukcji find.
find . -exec grep foo {} +pokaże ci takie wyniki./dir/file.py:from foo import bar
find . -exec grep foo {} \;pokaże ci takie wynikifrom foo import bar
find . -exec grep -l foo {} +pokaże ci takie wyniki./dir/file.py
find . -exec grep -l foo {} \;pokaże ci taki wynik./dir/file.py
W ogóle nie musisz tego używać find; grep jest w stanie obsłużyć otwieranie plików z globalnej listy wszystkiego w bieżącym katalogu:
grep chrome *
... lub nawet rekurencyjnie dla folderu i wszystkiego pod nim:
grep chrome . -R
findkiedy grepmożna wykonać zadanie, ale w niektórych przypadkach bardziej efektywne byłoby skorzystanie z funkcji znajdowania, aby dopracować listę plików przed wyjściem grep.
grepw takim przypadku execnie dusi się .
find . | xargs grep 'chrome'
możesz także:
find . | xargs grep 'chrome' -ls
Pierwszy pokazuje linie w plikach, drugi po prostu wyświetla listę plików.
Opcja Caleba jest ładniejsza, mniej naciśnięć klawiszy.
xargspolega na tym, że oczekuje, że jego dane wejściowe będą cytowane w szczególny sposób, findktóry nie daje rezultatów. Więc find … | xargs …nie działa, jeśli masz nazwy plików zawierające białe znaki lub \'".
find . | xargs -n1 -iX grep "X" 'chrome', aby argumenty były podawane pojedynczo i cytowane. Oczywiście jest to strasznie nieefektywny sposób radzenia sobie z tym przykładem, ale w niektórych sytuacjach jest to przyjemne.
xargsradzenia sobie z nazwami plików w Linuksie jest find ... -print0 | xargs -0użycie NUL jako separatora. Alternatywa - xargs -d '\n'zastosowanie separatora nowej linii, 99% niezawodności.
Znajdź to jeden ze sposobów i możesz spróbować, the_silver_searchera następnie wystarczy
ag chrome
Przeszukuje chrome we wszystkich plikach (włączając podkatalogi) i jest szybszy niż znajdź
Aby wyświetlić listę plików zamiast wierszy:
grep -l "chrome" *
lub:
grep -r -l "chrome" .
Oto przykład tego, jak zwykle używam find / exec ...
find . -name "*.py" -print -exec fgrep hello {} \;
Wyszukuje rekurencyjnie wszystkie pliki .py, a dla każdego pliku drukuje nazwę pliku i fgrep dla 'witaj' w tym (dla każdego) pliku. Dane wyjściowe wyglądają (właśnie uruchomiłem dzisiaj):
./r1.py
./cgi-bin/tst1.py
print "hello"
./app/__init__.py
./app/views.py
./app/flask1.py
./run.py
./tst2.py
print "hello again"
find . -name "*.py" -exec fgrep -l hello {} \; - wypisze nazwy plików pasujących plików i nic więcej