varios todos renombrar otro mover los directorio crear copiar comando archivos archivo linux bash shell

linux - todos - Cómo copiar un archivo a múltiples directorios usando el comando gnu cp



mover varios archivos en linux (20)

Esencialmente equivalente a la respuesta de xargs, pero en caso de que desee una ejecución paralela:

parallel -q cp file1 ::: /foo/ /bar/

Entonces, por ejemplo, para copiar el archivo1 en todos los subdirectorios de la carpeta actual (incluida la recursividad):

parallel -q cp file1 ::: `find -mindepth 1 -type d`

NB: Esto probablemente solo conlleva ganancias de velocidad notables para casos de uso muy específicos, por ejemplo, si cada directorio de destino es un disco distinto.

También es funcionalmente similar al argumento ''-P'' para xargs.

¿Es posible copiar un solo archivo en múltiples directorios usando el comando cp?

Intenté lo siguiente, que no funcionó:

cp file1 /foo/ /bar/ cp file1 {/foo/,/bar}

Sé que es posible usar un for loop, o find. Pero, ¿es posible usar el comando gnu cp?


Esto se copiará a los subdirectorios inmediatos, si quiere profundizar, ajuste el parámetro -maxdepth .

find . -mindepth 1 -maxdepth 1 -type d| xargs -n 1 cp -i index.html

Si no desea copiar a todos los directorios, con suerte puede filtrar los directorios que no le interesan. Copiar ejemplo a todas las carpetas que comiencen con a

find . -mindepth 1 -maxdepth 1 -type d| grep //a |xargs -n 1 cp -i index.html

Si copia en un conjunto arbitrario / disjunto de directorios, necesitará la sugerencia de Robert Gamble.


Los comodines también funcionan con el código de Roberts

echo ./fs*/* | xargs -n 1 cp test


Me gusta copiar un archivo en varios directorios como tal: cp file1 /foo/; cp file1 /bar/; cp file1 /foo2/; cp file1 /bar2/ cp file1 /foo/; cp file1 /bar/; cp file1 /foo2/; cp file1 /bar2/ cp file1 /foo/; cp file1 /bar/; cp file1 /foo2/; cp file1 /bar2/ Y copiando un directorio en otros directorios: cp -r dir1/ /foo/; cp -r dir1/ /bar/; cp -r dir1/ /foo2/; cp -r dir1/ /bar2/ cp -r dir1/ /foo/; cp -r dir1/ /bar/; cp -r dir1/ /foo2/; cp -r dir1/ /bar2/

Sé que es como emitir varios comandos, pero me funciona bien cuando quiero escribir 1 línea y alejarme por un tiempo.


No puedes hacer esto con cp solo, pero puedes combinar cp con xargs :

echo dir1 dir2 dir3 | xargs -n 1 cp file1

dir1 en dir1 , dir2 y dir3 . xargs llamará a cp 3 veces para hacer esto, consulte la página man para xargs para más detalles.


No usa cp per se, pero ...

Esto surgió para mí en el contexto de copiar muchas secuencias de Gopro desde una tarjeta SD (lenta) a tres unidades USB (lentas). Quería leer los datos solo una vez, porque me llevó una eternidad. Y lo quería recursivo.

$ tar cf - src | tee >( cd dest1 ; tar xf - ) >( cd dest2 ; tar xf - ) | ( cd dest3 ; tar xf - )

(Y puede agregar más de esas secciones> () si desea obtener más resultados).

No lo he comparado, pero definitivamente es mucho más rápido que cp-in-a-loop (o un montón de invocaciones de cp paralelas).


No, cp puede copiar múltiples fuentes pero solo copiará a un solo destino. Debe organizar invocar cp varias veces, una vez por destino, para lo que desea hacer; usando, como dices, un bucle o alguna otra herramienta.


No, no puedes.

He encontrado en varias ocasiones que podría usar esta funcionalidad, así que hice mi propia herramienta para hacer esto por mí.

http://github.com/ddavison/branch

bastante simple -
branch myfile dir1 dir2 dir3


Otra forma es usar cat y tee de la siguiente manera:

cat <source file> | tee <destination file 1> | tee <destination file 2> [...] > <last destination file>

Creo que esto sería bastante ineficiente, ya que el trabajo se dividiría entre varios procesos (uno por destino) y el disco duro escribiría varios archivos a la vez en diferentes partes del plato. Sin embargo, si quisiera escribir un archivo en varias unidades diferentes, este método probablemente sería bastante eficiente (ya que todas las copias podrían suceder al mismo tiempo).


Para usar la copia con xargs en directorios que usan comodines en Mac OS, la única solución que funcionó para mí con espacios en el nombre del directorio es:

find ./fs*/* -type d -print0 | xargs -0 -n 1 cp test

Donde la test es el archivo para copiar
Y ./fs*/* los directorios para copiar a

El problema es que xargs ve espacios como un nuevo argumento, desafortunadamente las soluciones para cambiar el carácter delimitador usando -d o -E no funcionan correctamente en Mac OS.


Por ejemplo, si se encuentra en el directorio principal de sus carpetas de destino, puede hacer lo siguiente:

para yo en $ (ls); hacer cp archivo de origen $ i; hecho


Por lo que puedo ver, puedes usar lo siguiente:

ls | xargs -n 1 cp -i file.dat

La opción -i del comando cp significa que se le preguntará si desea sobrescribir un archivo en el directorio actual con el file.dat . Aunque no es una solución completamente automática, funcionó para mí.


Si necesita especificar en qué carpetas copiar el archivo, puede combinar encontrar con uno o más greps. Por ejemplo, para reemplazar cualquier aparición de favicon.ico en cualquier subcarpeta que pueda usar:

find . | grep favicon/.ico | xargs -n 1 cp -f /root/favicon.ico


Si quieres hacerlo sin un comando bifurcado:

tee <inputfile file2 file3 file4 ... >/dev/null


Supongamos que desea copiar fileName.txt a todos los subdirectorios dentro del directorio de trabajo actual.

  1. Obtenga todos los nombres de subdirectorios a través de ls y guárdelos en un archivo temporal, por ejemplo, allFolders.txt

    ls > allFolders.txt

  2. Imprima la lista y páselo al comando xargs .

    cat allFolders.txt | xargs -n 1 cp fileName.txt


Todas estas respuestas parecen más complicadas que lo obvio:

for i in /foo /bar; do cp "$file1" "$i"; done



si quieres copiar varias carpetas en varias carpetas, puedes hacer algo como esto:

echo dir1 dir2 dir3 | xargs -n 1 cp -r / path / toyourdir / {subdir1, subdir2, subdir3}


ls -db di*/subdir | xargs -n 1 cp File

-b en caso de que haya un espacio en el nombre del directorio; de lo contrario, se romperá como un elemento diferente por xargs, tuvo este problema con la versión de eco


ls -d */ | xargs -iA cp file.txt A