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 --versionci mówi
-exec {} +został dodany w 4.2.12 w 2005 r. W starszych znaleziskach GNU możesz użyć (nie POSIX), -print0 | xargs -r0aby uzyskać coś podobnego. 4.1pochodzi z 1994 r.
-nameargumenty wzorca powinny być podane: -name "*.c" -o -name "*.h". To prawda, chociaż nie ma to związku z -execbłę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 -osą 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ć greptylko na .hplikach. 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 '{}' \+