Copie archivos de un directorio a un directorio existente

248

En bash necesito hacer esto:

  1. tomar todos los archivos en un directorio

  2. copiarlos en un directorio existente

¿Cómo hago esto? Lo intenté cp -r t1 t2(tanto t1 como t2 son directorios existentes, t1 tiene archivos) pero creó un directorio llamado t1 dentro de t2, no quiero eso, necesito que los archivos en t1 vayan directamente dentro de t2. ¿Cómo hago esto?

David Chang
fuente
11
¿Por qué se cerró esto? Es arbitrario si un comando bash es un comando incorporado o externo (por ejemplo, printf existe como ambos en la mayoría de los sistemas), por lo que las cppreguntas pueden verse como bashpreguntas, que es un lenguaje de programación. Nunca he visto que se cerrara una pregunta de Python sobre la copia de archivos.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
Eche un vistazo a este stackoverflow.com/questions/23698183/…
theGiallo
Llegué en busca de un recordatorio sobre la sintaxis del comando Bash shell copy, y me complace informar que estos comandos también parecen funcionar contra el sistema de archivos NTFS subyacente en mi instalación de Windows.
David A. Gray

Respuestas:

396

Lo que quieres es:

cp -R t1/. t2/

El punto al final le dice que copie el contenido del directorio actual, no el directorio en sí. Este método también incluye archivos y carpetas ocultos.

Mella
fuente
2
Realmente me gusta esta sintaxis, pero por alguna razón no funciona mv. ¿Alguien sabe por qué?
Martin von Wittich
2
Asombroso. ¿Dónde se documenta esto? ¿Es POSIX o extensión?
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
99
@CiroSantilli 六四 事件 法轮功 包 卓 轩 Si copia un directorio, cp creará un directorio y copiará todos los archivos en él. Si usa la carpeta de simulación llamada ".", Que es lo mismo que el directorio que la contiene, la copia se comporta de esta manera. Digamos que t1 contiene un archivo llamado "archivo". cp realizará la operación equivalente a "cp t1 /./ file t2 /./". Está copiando la carpeta ".", Pero copiando archivos en t2 "." la carpeta elimina "./" porque "t2 /./" es lo mismo que "t2 /". Técnicamente, esto significa que es un comportamiento integrado de POSIX ... ¡pero probablemente no de la forma que esperabas!
llamativo
35

Si desea copiar algo de un directorio al directorio actual , haga lo siguiente:

cp dir1/* .

Esto supone que no está intentando copiar archivos ocultos.

Karl Giesing
fuente
20
Pierde archivos ocultos.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
1
También falla para una gran cantidad de archivos (porque '*' no puede expandirse a infinitos archivos ...) y
moritzschaefer
32
cp dir1/* dir2

O si tiene directorios dentro de dir1 que también desea copiar

cp -r dir1/* dir2
Bertrand Marron
fuente
3
Dependiendo de cómo esté configurado su shell, probablemente necesitará usar "dir1 / * dir1 /.*" en lugar de "dir1 / *" si también desea capturar archivos ocultos.
ssokolow
2
Copiar dir1/.*no es una buena idea, ya que copia dir1 / .. (es decir, el padre del directorio que realmente está intentando copiar). También copia dir1 /. lo cual está bien, excepto que ya (en su mayoría) se ha copiado, por lo que está haciendo el trabajo dos veces.
Gordon Davisson el
1
Puede dir1/.*solucionar el problema de los archivos / ocultos ingresando en el directorio desde el que desea copiar y luego refiriéndose a él como .. Por lo tanto, si desea copiar todos los archivos, incluidos los archivos ocultos de un directorio a un directorio existente, puede: cd [source dir], cp . [path to destination dir, with no trailing slash].
RobW
8

Suponiendo que t1 es la carpeta con archivos, y t2 es el directorio vacío. Lo que quieres es algo como esto:

sudo cp -R t1/* t2/

Tenga en cuenta que, para el primer ejemplo, t1 y t2 tienen que ser las rutas completas o las rutas relativas (según dónde se encuentre). Si lo desea, puede navegar a la carpeta vacía (t2) y hacer esto:

sudo cp -R t1/* ./

O puede navegar a la carpeta con archivos (t1) y hacer esto:

sudo cp -R ./* t2/

Nota: El signo * (o comodín) representa todos los archivos y carpetas. La bandera -R significa recursivamente (todo dentro de todo).

Konkret
fuente
2
cp -R t1/ t2

La barra inclinada final en el directorio fuente cambia la semántica ligeramente, por lo que copia el contenido pero no el directorio en sí. También evita los problemas con archivos globales e invisibles que tiene la respuesta de Bertrand (copiar t1/*archivos invisibles perdidos, copiar copias 't1 / * t1 /.*' t1 /. Y t1 / ..., que no desea).

Gordon Davisson
fuente
Su solución no funciona, al menos no en mi instalación (ubuntu 12.10) $ mkdir t1 $ mkdir t2 $ touch t1/one $ touch t1/two $ touch t1/.three $ cp -R t1/ t2 $ ls t2/ t1 (lo siento, no hay formato de código en los comentarios, versión legible en pastebin.com/yszSxV6G )
zpon
2

Dependiendo de algunos detalles, es posible que deba hacer algo como esto:

r=$(pwd)
case "$TARG" in
    /*) p=$r;;
    *) p="";;
    esac
cd "$SRC" && cp -r . "$p/$TARG"
cd "$r"

... esto básicamente cambia al directorio SRC y lo copia en el destino, luego regresa a donde haya comenzado.

El alboroto adicional es manejar objetivos relativos o absolutos.

(Esto no se basa en la semántica sutil del cpcomando en sí ... sobre cómo maneja las especificaciones de origen con o sin un seguimiento / ... ya que no estoy seguro de que sean estables, portátiles y confiables más allá de GNU cpy yo no sé si seguirán siéndolo en el futuro).

Jim Dennis
fuente
1

Para dentro de algún directorio, esto se usará completo ya que copia todo el contenido de "carpeta1" al nuevo directorio "carpeta2" dentro de algún directorio.

$ (pwd) obtendrá la ruta para el directorio actual.

Observe el punto (.) Después de la carpeta1 para obtener todos los contenidos dentro de la carpeta1

cp -r $(pwd)/folder1/. $(pwd)/folder2
Bidyashish Kumar
fuente