Questo è quello che vuoi:
find . -name myFile -exec cp /home/myuser/myFile {} ';'
Una ripartizione / spiegazione di questo:
find
:invocando il comando find.
:avvia la ricerca dalla directory di lavoro corrente.- Poiché non sono specificati flag di profondità, questo cercherà in modo ricorsivo tutte le sottocartelle
-name myFile
:trova i file con il nome esplicitomyFile
-exec
:per i risultati della ricerca, esegui comandi aggiuntivi con essicp /home/myuser/myFile {}
:copia/home/myuser/myFile
per sovrascrivere ogni risultato restituito dafind
a; pensa a{}
come dove va ogni risultato di ricerca.';'
:utilizzato per separare diversi comandi da eseguire dopofind
Ci sono un paio di modi per risolvere questo problema, a seconda che tu debba preoccuparti di file con spazi o altri caratteri speciali nei loro nomi.
Se nessuno dei nomi di file ha spazi o caratteri speciali (sono costituiti solo da lettere, numeri, trattini e caratteri di sottolineatura), la seguente è una soluzione semplice che funzionerà. Puoi usare $(command)
per eseguire un comando e sostituire i risultati negli argomenti di un altro comando. La shell suddividerà il risultato in spazi, tabulazioni o newline e for
assegna ciascun valore a $f
a sua volta ed esegui il comando su ciascun valore.
for f in $(find . -name myFile)
do
cp something $f
done
Se hai spazi o tabulazioni, puoi usare -exec
di find opzione. Superi -exec command args
, inserendo {}
dove vuoi che il nome del file venga sostituito e terminando gli argomenti con un ;
. Devi citare il {}
e ;
in modo che la shell non li interpreti.
find . -name myFile -exec cp something "{}" \;
A volte -exec
non è sufficiente. Ad esempio, in questa domanda, volevano utilizzare l'espansione dei parametri di Bash per calcolare il nome del file. Per farlo, devi passare -exec bash -c 'your command'
, ma poi ti imbatterai in problemi di citazione con {}
sostituzione. Per risolvere questo problema, puoi usare -print0
da find
per stampare i risultati delimitati da caratteri nulli (che non sono validi nei nomi di file) e reindirizzarli a un while read
ciclo che divide i parametri sui null:
find . -name myFile -print0 | (while read -d $'\0' f; do
cp something "$f"
done)
La pipe invierà l'output di un programma all'input di un altro. cp
non legge dal suo flusso di input al terminale, utilizza semplicemente gli argomenti sulla riga di comando.
Vuoi utilizzare xargs
con la pipe o find
exec
di argomento invece di pipe.
find . -name myFile 2>&1 | xargs -I {} cp /home/myuser/myFile {}
Nota:opzione -I {}
definisce {}
come segnaposto puoi in alternativa utilizzare un altro segnaposto se è in conflitto con il comando da eseguire.