Próbuję uruchomić następujące polecenie:
find a/folder b/folder -name *.c -o -name *.h -exec grep -I foobar '{}' +
To zwraca błąd:
find: missing argument to -exec
Nie widzę, co jest nie tak z tym poleceniem, ponieważ wydaje się pasować do strony podręcznika:
-exec polecenie {} +
Ten wariant opcji -exec uruchamia określone polecenie na wybranych plikach, ale wiersz poleceń jest budowany przez dołączenie każdej wybranej nazwy pliku na końcu; całkowita liczba wywołań polecenia będzie znacznie mniejsza niż liczba dopasowanych plików. Linia poleceń jest budowana w taki sam sposób, jak xargs buduje swoje linie poleceń. W poleceniu dozwolona jest tylko jedna instancja „{}”. Polecenie jest wykonywane w katalogu startowym.
Próbowałem też:
find a/folder b/folder -name *.c -o -name *.h -exec grep -I foobar {} +
find a/folder b/folder -name *.c -o -name *.h -exec 'grep -I foobar' {} +
find a/folder b/folder -name *.c -o -name *.h -exec 'grep -I foobar' '{}' +
find a/folder b/folder -name "*.c" -o -name "*.h" -exec grep -I foobar '{}' +
find a/folder b/folder \( -name *.c -o -name *.h \) -exec grep -I foobar '{}' +
find a/folder b/folder -name *.c -o -name *.h -exec grep -I foobar '{}' \+
find
. Chociaż -exec cmd {} +
wariant jest POSIX i był dostępny od lat 80., GNU znalazł go (stosunkowo) dopiero niedawno (2005). Co find --version
ci mówi
-exec {} +
został dodany w 4.2.12 w 2005 r. W starszych znaleziskach GNU możesz użyć (nie POSIX), -print0 | xargs -r0
aby uzyskać coś podobnego. 4.1
pochodzi z 1994 r.
-name
argumenty wzorca powinny być podane: -name "*.c" -o -name "*.h"
. To prawda, chociaż nie ma to związku z -exec
błędem. Zauważysz, że wszystkie pozostałe odpowiedzi umieszczają symbole wieloznaczne w cudzysłowie, chociaż tylko Gilles o tym wspomina. … (Ciąg dalszy)
-name "*.[ch]"
bez wyjaśnienia. Ma to tę zaletę, że upraszcza wiersz poleceń, a w szczególności eliminuje -o
. Znajdź wyrażenia wymagające -o
są trudne do znalezienia . Twoje jest złe; jeśli twoje polecenie zostanie naprawione, aby nie było błędu (jak w odpowiedzi Gillesa), będzie działać grep
tylko na .h
plikach. Musisz to zrobić '(' -name '*.c' -o -name '*.h' ')'
.
+
na końcu?find a/folder b/folder -name *.c -o -name *.h -exec grep -I foobar '{}' \+