¿Cómo copiar un archivo a varias carpetas usando la línea de comando?

59

He intentado copiar un archivo test.txt en varios directorios con un solo comando:

cp ~/test.txt ~/folder1 ~/folder2

Pero no tuve éxito. ¿Hay alguna forma de hacerlo en un comando para poder copiar un archivo o incluso una carpeta en varios directorios?

    
pregunta nux 11.03.2014 - 16:11

7 respuestas

65

cp puede copiar de varias fuentes, pero no puede copiar a múltiples destinos. Ver man cp para más información.

El único comando bash que sé que puede copiar / guardar en múltiples destinos es tee .

Puede usarlo en su caso de la siguiente manera:

tee ~/folder1/test.txt ~/folder2/test.txt < ~/test.txt

Tenga en cuenta que tee también escribe la entrada en la salida estándar (stdout). Entonces, si no quiere esto, puede evitarlo redirigiendo la salida estándar a /dev/null de la siguiente manera:

tee ~/folder1/test.txt ~/folder2/test.txt < ~/test.txt >/dev/null
    
respondido por el Radu Rădeanu 11.03.2014 - 17:01
54

Otra forma de lograr una copia en varias ubicaciones es el siguiente comando:

find dir1 dir2 -exec cp file.txt {} \;

Si dir1 o dir2 tienen subdirectorios en los que no desea que se copie el archivo, agregue Opción -maxdepth 0 :

find dir1 dir2 -maxdepth 0 -exec cp file.txt {} \;

Tenga en cuenta que esto sobrescribirá todos los archivos en dir1 y dir2 con el contenido de file.txt , además de copiarlo. Para copiar solo file.txt sin afectar a otros archivos en estos directorios, indique find que solo actúe en los directorios:

find dir1 dir2 -type d -exec cp file.txt {} \;
    
respondido por el Sylvain Pineau 11.03.2014 - 16:31
30

El comando

cp ~/test.txt ~/folder1 ~/folder2

intenta copiar dos archivos ( ~/test.txt y ~/folder1 ) al destino folder2 . (Y si ~/folder2 existe y es un directorio, tendrá una advertencia de "omitir directorio").

Si quiere hacer varias copias del archivo test.txt , debe usar un bucle o varios comandos ...

for i in ~/folder1 ~/folder2; do cp  ~/test.txt $i; done 

(... y tenga cuidado si tiene espacios incrustados en los nombres de los archivos, necesitará citas).

Para copiar directorios completos, debes usar la opción -r :

for i in ~/folder1 ~/folder2; do cp -r ~/folder3 $i; done

esto creará ~/folder1/folder3 y ~/folder2/folder3 con todos los archivos incluidos.

    
respondido por el Rmano 11.03.2014 - 16:25
23

Puede crear un script de ayuda, o puede hacerlo con xargs y una función de impresión (en este caso, echo ):

echo firstDir secondDir | xargs -n 1 cp test

Esto hará que cada directorio sea un argumento para la función cp , usando el archivo prueba como parámetro.

    
respondido por el Evandro Silva 11.03.2014 - 16:28
6

¡Después de una larga búsqueda, esto también funciona como un Hechizo!

for dir in *; do [ -d "$dir" ] && cp /path/file.txt "$dir" ; done

Esto copiará file.txt a todos los directorios en su ubicación actual en la terminal.

for dir in *; do [ -d "$dir" ] && cp -rf /path/folder "$dir" ; done

Esto copiará una carpeta a cada subdirectorio en su ubicación actual en la terminal.

Lo comparto, espero que ayude a otros también.

    
respondido por el nux 12.03.2014 - 00:06
1

Si desea copiar el archivo test.txt en cada directorio en / tmp / target / ...

crear un entorno de prueba:

mkdir /tmp/target
cd /tmp/target
mkdir -v {folder1,folder2,folder3}
touch test.txt

cópialo:

find * -maxdepth 0 -type d -exec cp -vi test.txt {} \;
    
respondido por el matt 29.06.2015 - 14:26
0

Solo pensé en dar una variación a la respuesta de Sylvain Pineau

donde dir1 y dir2 no están en su directorio actual.

find ./ -maxdepth 2 -type d -name dir1 -exec cp file.txt {} \;

aquí buscar buscará dir1 dos niveles profundos o puede omitir el parámetro -maxdepth para encontrar dir1 en todas las carpetas del directorio actual y debajo de él.

    
respondido por el Joshi 07.10.2017 - 18:42

Lea otras preguntas en las etiquetas