ci sono un paio di modi per risolvere questo, a seconda se è necessario preoccuparsi 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à. È possibile utilizzare $(command)
per eseguire un comando e sostituire i risultati negli argomenti di un altro comando. La shell dividerà il risultato su spazi, tabulazioni o nuove righe e for
assegnerà a turno ogni valore a $f
ed eseguirà il comando su ciascun valore.
for f in $(find . -name myFile)
do
cp something $f
done
Se si dispone di spazi o tabulazioni, è possibile utilizzare l'opzione di find -exec
. Si passa -exec command args
, inserendo {}
dove si desidera sostituire il nome file e terminando gli argomenti con uno ;
. È necessario citare lo {}
e ;
in modo che la shell non li interpreti.
find . -name myFile -exec cp something "{}" \;
A volte -exec
non è sufficiente. Ad esempio, in this question, volevano utilizzare l'espansione del parametro Bash per calcolare il nome file. Per fare ciò, devi passare -exec bash -c 'your command'
, ma poi ti capiterà di citare problemi con la sostituzione {}
. Per risolvere questo problema, è possibile utilizzare -print0
da find
di stampare i risultati delimitati con i caratteri nulli (che sono validi nei nomi dei file), e tubo ad un ciclo while read
che divide i parametri su valori nulli:
find . -name myFile -print0 | (while read -d $'\0' f; do
cp something "$f"
done)
fonte
2012-11-05 16:45:05
Basta cambiare l'ordine di {} nella seconda posizione, dopo/home/myuser/myFile, e funzionerà. Grazie. –
@ LuisAndrésGarcía, ah, avrei potuto fraintendermi - volevi copiare l'unico file '/ home/myuser/myFile' per sovrascrivere qualsiasi' myFile' trovato da 'find' nella cwd? –
Hai ragione! :) Un altro esempio, per elencare le proprietà di qualsiasi file trovato è: find -exec ls -l {} ';' –