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 perfind
e un altro percp
. -
Usa invece
exec()
all'interno difind
risolverà 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 ...)