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 --versionti dice?
-exec {} +è stato aggiunto in 4.2.12 nel 2005. Nei precedenti risultati GNU, è possibile utilizzare (non POSIX) -print0 | xargs -r0per ottenere qualcosa di simile. 4.1è del 1994.
-nameargomenti del modello dovrebbero essere citati: -name "*.c" -o -name "*.h". Questo è vero, anche se non è correlato -execall'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 grepsolo sui .hfile. 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 '{}' \+