Sto cercando di eseguire il seguente comando:
find a/folder b/folder -name *.c -o -name *.h -exec grep -I foobar '{}' +
Questo sta restituendo un errore:
find: missing argument to -exec
Non riesco a vedere cosa c'è che non va in questo comando, poiché sembra corrispondere alla pagina man:
-exec comando {} +
Questa variante dell'opzione -exec esegue il comando specificato sui file selezionati, ma la riga di comando viene creata aggiungendo alla fine ciascun nome di file selezionato; il numero totale di invocazioni del comando sarà molto inferiore al numero di file corrispondenti. La riga di comando è costruita nello stesso modo in cui xargs costruisce le sue righe di comando. Nel comando è consentita solo un'istanza di '{}'. Il comando viene eseguito nella directory iniziale.
Ho anche provato:
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
. Sebbene la -exec cmd {} +
variante sia POSIX ed è disponibile dagli anni '80, GNU la trova aggiunta (relativamente) di recente (2005). Che cosa find --version
ti dice?
-exec {} +
è stato aggiunto in 4.2.12 nel 2005. Nei precedenti risultati GNU, è possibile utilizzare (non POSIX) -print0 | xargs -r0
per ottenere qualcosa di simile. 4.1
è del 1994.
-name
argomenti del modello dovrebbero essere citati: -name "*.c" -o -name "*.h"
. Questo è vero, anche se non è correlato -exec
all'errore. Noterai che tutte le altre risposte mettono i caratteri jolly tra virgolette, anche se solo Gilles lo menziona. ... (proseguendo)
-name "*.[ch]"
senza spiegazioni. Ciò ha i vantaggi di semplificare la riga di comando e, in particolare, di eliminare -o
. Trova espressioni che coinvolgono -o
è difficile da ottenere. Il tuo è sbagliato; se il tuo comando è risolto in modo tale da non sbagliare (come nella risposta di Gilles), verrà eseguito grep
solo sui .h
file. Hai bisogno di fare '(' -name '*.c' -o -name '*.h' ')'
.
+
alla fine?find a/folder b/folder -name *.c -o -name *.h -exec grep -I foobar '{}' \+