Esto es lo que quieres:
find . -name myFile -exec cp /home/myuser/myFile {} ';'
Un desglose/explicación de esto:
find
:invocando el comando de búsqueda.
:iniciar la búsqueda desde el directorio de trabajo actual.- Dado que no se especifican indicadores de profundidad, esto buscará recursivamente todas las subcarpetas
-name myFile
:encuentra archivos con el nombre explícitomyFile
-exec
:para los resultados de búsqueda, ejecute comandos adicionales con elloscp /home/myuser/myFile {}
:copias/home/myuser/myFile
para sobrescribir cada resultado devuelto porfind
a; piensa en{}
como adónde va cada resultado de búsqueda.';'
:se usa para separar diferentes comandos que se ejecutarán después defind
Hay un par de formas de resolver esto, dependiendo de si necesita preocuparse por los archivos con espacios u otros caracteres especiales en sus nombres.
Si ninguno de los nombres de archivo tiene espacios o caracteres especiales (constan solo de letras, números, guiones y guiones bajos), la siguiente es una solución simple que funcionará. Puedes usar $(command)
para ejecutar un comando y sustituir los resultados en los argumentos de otro comando. El shell dividirá el resultado en espacios, tabulaciones o saltos de línea, y for
asigna cada valor a $f
a su vez, y ejecute el comando en cada valor.
for f in $(find . -name myFile)
do
cp something $f
done
Si tiene espacios o tabulaciones, puede usar -exec
de find opción. Pasas -exec command args
, poniendo {}
donde desea que se sustituya el nombre del archivo y termine los argumentos con un ;
. Debe citar el {}
y ;
para que el shell no los interprete.
find . -name myFile -exec cp something "{}" \;
A veces -exec
No es suficiente. Por ejemplo, en esta pregunta, querían usar la expansión de parámetros de Bash para calcular el nombre del archivo. Para hacerlo, debe pasar -exec bash -c 'your command'
, pero luego se encontrará con problemas de cotización con el {}
sustitución. Para resolver esto, puedes usar -print0
de find
para imprimir los resultados delimitados con caracteres nulos (que no son válidos en los nombres de archivo) y canalizarlos a un while read
bucle que divide parámetros en valores nulos:
find . -name myFile -print0 | (while read -d $'\0' f; do
cp something "$f"
done)
La tubería enviará la salida de un programa a la entrada de otro. cp
no lee de su flujo de entrada en la terminal, simplemente usa los argumentos en la línea de comando.
Quieres usar xargs
con la tubería o find
de exec
argumento en lugar de tuberías.
find . -name myFile 2>&1 | xargs -I {} cp /home/myuser/myFile {}
Nota:opción -I {}
define {}
como marcador de posición, también puede usar otro marcador de posición si entra en conflicto con el comando que se ejecutará.