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.
Jeśli używasz \; końcowy konstrukt grep jest przekazywany jeden plik na raz, więc domyślnie nie wyświetla nazwy pliku, tylko dopasowane linie. Aby zamiast tego uzyskać listę plików, dodaj użycie grep -lswewnątrz konstrukcji find.
grep dusi się, jeśli rozszerzenie przekroczy ARG_MAX. -R odwiedzi wszystko podczas korzystania z funkcji znajdowania, można łatwiej dodawać prymitywy, aby wykluczyć niektóre pliki (-name itp.), A nawet nie odwiedzać poddrzewa (-prune).
Dobre punkty @Mel. Chodziło mi o to, że najprawdopodobniej strona pytająca sprawiła, że sprawy były bardziej skomplikowane, niż trzeba, wprowadzając, 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.
Problem 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 \'".
@Gilles Możesz obejść ten problem, używając czegoś takiego 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.
Dla kompletności powinniśmy również wspomnieć o opcji -i dla niewrażliwości na wielkość liter w 'grep'. Istnieje również -iname w znajdowaniu dla niewrażliwości na wielkość liter.
@Caleb: Jedynym w 100% niezawodnym sposobem 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.
Istnieje również pt (wyszukiwarka platyny, dostępna na github.com/monochromegane/the_platinum_searcher ), która, IMHO, wykonuje zadanie szybciej - może nie mieć znaczenia, jeśli jest tylko kilka plików.
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):
aby nie zadzierać z przepływem pracy, ale możesz chcieć: find . -name "*.py" -exec fgrep -l hello {} \; - wypisze nazwy plików pasujących plików i nic więcej
Używamy plików cookie i innych technologii śledzenia w celu poprawy komfortu przeglądania naszej witryny, aby wyświetlać spersonalizowane treści i ukierunkowane reklamy, analizować ruch w naszej witrynie, i zrozumieć, skąd pochodzą nasi goście.
Kontynuując, wyrażasz zgodę na korzystanie z plików cookie i innych technologii śledzenia oraz potwierdzasz, że masz co najmniej 16 lat lub zgodę rodzica lub opiekuna.