Ich versuche den folgenden Befehl auszuführen:
find a/folder b/folder -name *.c -o -name *.h -exec grep -I foobar '{}' +
Dies gibt einen Fehler zurück:
find: missing argument to -exec
Ich kann nicht sehen, was mit diesem Befehl nicht stimmt, da er mit der Manpage übereinstimmt:
-exec Befehl {} +
Diese Variante der Option -exec führt den angegebenen Befehl für die ausgewählten Dateien aus. Die Befehlszeile wird jedoch erstellt, indem jeder ausgewählte Dateiname am Ende angehängt wird. Die Gesamtzahl der Aufrufe des Befehls ist viel geringer als die Anzahl der übereinstimmenden Dateien. Die Befehlszeile ist in etwa so aufgebaut wie die Befehlszeilen von xargs. Innerhalb des Befehls ist nur eine Instanz von '{}' zulässig. Der Befehl wird im Startverzeichnis ausgeführt.
Ich habe auch versucht:
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
. Obwohl die -exec cmd {} +
Variante POSIX ist und seit den 80er Jahren verfügbar ist, hat GNU find sie erst (relativ) vor kurzem (2005) hinzugefügt. Was find --version
sagt dir das?
-exec {} +
wurde in 4.2.12 im Jahr 2005 hinzugefügt. In älteren GNU-Funden können Sie das (nicht-POSIX) verwenden -print0 | xargs -r0
, um etwas Ähnliches zu erhalten. 4.1
ist von 1994.
-name
Muster Argumente sollen zitiert werden: -name "*.c" -o -name "*.h"
. Dies ist wahr, obwohl es nichts mit dem -exec
Fehler zu tun hat. Sie werden feststellen, dass alle anderen Antworten die Platzhalter in Anführungszeichen setzen, obwohl nur Gilles dies erwähnt. … (Fortsetzung)
-name "*.[ch]"
ohne Erklärung. Dies hat den Vorteil, dass die Befehlszeile vereinfacht und insbesondere die Befehlszeile entfernt wird -o
. Es -o
ist schwierig, Ausdrücke zu finden, die etwas betreffen . Dein ist falsch; Wenn Ihr Befehl so festgelegt ist, dass er nicht ausfällt (wie in Gilles 'Antwort), wird er grep
nur für die .h
Dateien ausgeführt. Das musst du tun '(' -name '*.c' -o -name '*.h' ')'
.
+
am Ende der Flucht ?find a/folder b/folder -name *.c -o -name *.h -exec grep -I foobar '{}' \+