C'è un'opzione poco usata per cp :-t destination -- vedi la pagina man:
find . -iname "*.SomeExt" | xargs cp -t Directory
Puoi usare | come di seguito:
find . -iname "*.SomeExt" | while read line
do
cp $line DestDir/
done
Rispondendo alle tue domande:
-
|può essere utilizzato per risolvere questo problema. Ma come visto sopra, coinvolge molto codice. Inoltre,|creerà due processi:uno perfinde un altro percp. -
Usa invece
exec()all'interno difindrisolverà il problema in un unico processo.
Bella domanda!
- perché non puoi semplicemente usare | tubo? non è a questo che serve?
Puoi reindirizzare, ovviamente, xargs è fatto per questi casi:
find . -iname "*.SomeExt" | xargs cp Destination_Directory/
- Perché tutti consigliano -exec
Il -exec è buono perché fornisce un maggiore controllo su esattamente ciò che stai eseguendo. Ogni volta che esegui il pipe potrebbero esserci problemi con i casi limite:nomi di file contenenti spazi o nuove righe, ecc.
- come faccio a sapere quando usare quel (exec) su pipe | ?
Dipende davvero da te e ci possono essere molti casi. Userei -exec ogni volta che l'azione da compiere è semplice. Non sono un buon amico di xargs , tendo a preferire un approccio in cui find l'output viene fornito a un while ciclo, ad esempio:
while IFS= read -r result
do
# do things with "$result"
done < <(find ...)