¿Es posible copiar un solo archivo a 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 bucle for o find. Pero, ¿es posible usar el comando gnu cp?
No puedes hacer esto
cp
solo, pero puedes combinarlocp
conxargs
:Copiará
file1
adir1
,dir2
ydir3
.xargs
llamarácp
3 veces para hacer esto, vea la página del manualxargs
para más detalles.fuente
cp
solo". El hecho de que la respuesta haya intentado ser útil al sugerir otra forma no significa que la pregunta no haya sido respondida.echo dir[1-3] | xargs -n 1 cp filename
).Los comodines también funcionan con el código Roberts
fuente
Por lo que puedo ver, puedes usar lo siguiente:
La
-i
opción decp
comando significa que se le preguntará si desea sobrescribir un archivo en el directorio actual con elfile.dat
. Aunque no es una solución completamente automática, funcionó para mí.fuente
-i
protección, ¿eso no te incitará a escribir más de cada archivo? en lugar de copiar a los directorios?cp: overwrite
preguntas, pero no tuve que responder ninguna de ellas, y no sobrescribió los archivos.Lo usaría
cat
ytee
basándome en las respuestas que vi en /superuser/32630/parallel-file-copy-from-single-source-to-multiple-targets en lugar decp
.Por ejemplo:
fuente
cat <inputfile> | tee /path-to-files/outfile{1..4} > /dev/null
tee < inputfile outfile1 outfile2 > /dev/null
También es un patrón útil como lo muestra la respuesta de Taywee. Tenga en cuenta el uso de io-redirección con '<' para que no se necesite la tubería de cat.Todas estas respuestas parecen más complicadas que las obvias:
fuente
for d in */ ; do cp $file "$i" done
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, xargs lo dividirá como un elemento diferente, tuvo este problema con la versión echofuente
No usa cp per se, pero ...
Esto se me ocurrió en el contexto de copiar muchas imágenes de Gopro de una tarjeta SD (lenta) a tres unidades USB (lentas). Solo quería leer los datos una vez, porque me llevó una eternidad. Y lo quería recursivo.
(Y puede agregar más de esas secciones> () si desea más salidas).
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).
fuente
Para usar la copia con
xargs
directorios usando comodines en Mac OS, la única solución que me funcionó con espacios en el nombre del directorio es:¿Dónde
test
está el archivo para copiary
./fs*/*
los directorios para copiar?El problema es que xargs ve los espacios como un nuevo argumento, las soluciones para cambiar el carácter delimitador usando
-d
o-E
desafortunadamente no funciona correctamente en Mac OS.fuente
Si quieres hacerlo sin un comando bifurcado:
tee <inputfile file2 file3 file4 ... >/dev/null
fuente
Esencialmente equivalente a la respuesta xargs, pero en caso de que desee una ejecución paralela:
Entonces, por ejemplo, para copiar el archivo1 en todos los subdirectorios de la carpeta actual (incluida la recursividad):
NB: Esto probablemente solo transmite 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.
fuente
No, no puedes.
En varias ocasiones descubrí que podí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
fuente
/e
por ejemplo, solo una vez en cada máquina, entonces podría escribir mis propias herramientas y guardarlas para siempre.fuente
Suponga que desea copiar
fileName.txt
a todos los subdirectorios dentro del directorio de trabajo actual.Obtenga todos los nombres de subdirectorios
ls
y guárdelos en algún archivo temporal, por ejemplo,allFolders.txt
Imprima la lista y páselo al comando
xargs
.fuente
Otra forma es usar cat y tee de la siguiente manera:
Sin embargo, 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 desea escribir un archivo en varias unidades diferentes, este método probablemente sería bastante eficiente (ya que todas las copias podrían ocurrir simultáneamente).
fuente
Usando un script bash
fuente
Si desea copiar varias carpetas en varias carpetas, puede hacer algo como esto:
echo dir1 dir2 dir3 | xargs -n 1 cp -r / ruta / toyourdir / {subdir1, subdir2, subdir3}
fuente
Si todos sus directorios de destino coinciden con una expresión de ruta, como si fueran todos subdirectorios de
path/to
, entonces solo usefind
en combinación concp
esto:Eso es.
fuente
find
en hilo.Si necesita ser específico en qué carpetas copiar el archivo, puede combinar encontrar con uno o más greps. Por ejemplo, para reemplazar cualquier ocurrencia de favicon.ico en cualquier subcarpeta, puede usar:
fuente
Esto se copiará en los subdirectorios inmediatos, si desea profundizar, ajuste el
-maxdepth
parámetro.Si no desea copiar a todos los directorios, es de esperar que pueda filtrar los directorios que no le interesan. Ejemplo de copia a todas las carpetas que comienzan con
a
Si copia a un conjunto de directorios arbitrario / disjunto, necesitará la sugerencia de Robert Gamble.
fuente
Me gusta copiar un archivo en múltiples directorios como tal:
cp file1 /foo/; cp file1 /bar/; cp file1 /foo2/; cp file1 /bar2/
Y copiar un directorio en otros directorios:cp -r dir1/ /foo/; cp -r dir1/ /bar/; cp -r dir1/ /foo2/; cp -r dir1/ /bar2/
Sé que es como emitir varios comandos, pero funciona bien para mí cuando quiero escribir 1 línea y alejarme por un tiempo.
fuente
Por ejemplo, si está en el directorio principal de sus carpetas de destino, puede hacer:
para i en $ (ls); hacer cp sourcefile $ i; hecho
fuente
ls
, y siempre cite las variables.for i in ./*; do cp sourcefile "$i"; done