La pagina di manuale (o il manuale GNU in linea ) spiega praticamente tutto.
trova -exec comando {} \;
Per ogni risultato, command {}
viene eseguito. Tutte le occorrenze di {}
vengono sostituite dal nome del file. ;
è preceduto da una barra per impedire alla shell di interpretarlo.
trova -exec comando {} +
Ogni risultato viene aggiunto command
ed eseguito successivamente. Tenendo conto dei limiti di lunghezza del comando, immagino che questo comando possa essere eseguito più volte, con la pagina di manuale che mi supporta:
il numero totale di invocazioni del comando sarà molto inferiore al numero di file corrispondenti.
Nota questa citazione dalla pagina del manuale:
La riga di comando è costruita più o meno nello stesso modo in cui xargs costruisce le sue righe di comando
Ecco perché non sono consentiti caratteri tra {}
e ad +
eccezione degli spazi bianchi. +
fa in modo che find rilevi che gli argomenti dovrebbero essere aggiunti al comando proprio come xargs
.
La soluzione
Fortunatamente, l'implementazione GNU di mv
può accettare la directory di destinazione come argomento, con uno -t
o il parametro più lungo --target
. Il suo utilizzo sarà:
mv -t target file1 file2 ...
Il tuo find
comando diventa:
find . -type f -iname '*.cpp' -exec mv -t ./test/ {} \+
Dalla pagina del manuale:
-exec comando;
Eseguire il comando; true se viene restituito lo stato 0. Tutti gli argomenti seguenti per find vengono considerati argomenti del comando fino a quando un argomento composto da `; ' è incontrato. La stringa "{}" è sostituita dal nome del file corrente in fase di elaborazione ovunque si trovi negli argomenti del comando, non solo negli argomenti in cui è solo, come in alcune versioni di find. Potrebbe essere necessario eseguire l'escape (con una "\") o le virgolette per entrambe queste costruzioni per proteggerle dall'espansione della shell. Vedere la sezione ESEMPI per esempi di utilizzo dell'opzione -exec. Il comando specificato viene eseguito una volta per ogni file corrispondente. Il comando viene eseguito nella directory iniziale. Ci sono inevitabili problemi di sicurezza che circondano l'uso dell'azione -exec; dovresti invece usare l'opzione -execdir.
-exec comando {} +
Questa variante dell'azione -exec esegue il comando specificato sui file selezionati, ma la riga di comando viene creata aggiungendo ogni nome di file selezionato alla fine; il numero totale di invocazioni del comando sarà molto inferiore al numero di file corrispondenti. La riga di comando è costruita più o meno nello stesso modo in cui xargs costruisce le sue righe di comando. È consentita una sola istanza di "{}" all'interno del comando. Il comando viene eseguito nella directory iniziale.