¿Cómo se copia todo el contenido de un directorio en otro?
Por ejemplo:
$ cd /home/newuser
$ cp -a /backup/olduser/* .
El problema con lo anterior es que el patrón global '*' coincide con los directorios ocultos '.' y '..' y terminas con un directorio 'olduser' dentro de 'newuser', así como los contenidos.
También podrías hacer algo como esto:
$ rmdir /home/newuser
$ cp -a /backup/olduser /home/newuser
Pero, ¿qué pasa si newuser ya contiene algunos archivos y directorios predeterminados?
¿Cuál es la forma más simple, más correcta, más fácil de recordar y no desordenada de mover el contenido de un directorio a otro usando solo el comando básico 'cp' y el shell?
.
y cómo..
trabajo. ¿Le importaria explicar?cp -r ./a b
no lo hizo. ¿Alguna idea de por qué?r
opción no es necesaria. Laa
opción implicar
.-a
parámetro no hace nada para ayudar en esta situación. El comandocp -r ./a/. b
copiará el contenido, y solo el contenido, del directorioa
en el directoriob
. La-a
bandera conserva enlaces, marcas de tiempo, etc., que no es relevante para la pregunta.Dos directorios a y b.
Ambos tienen archivos.
Estás en un directorio que contiene ay b.
-r
= recursivamente.fuente
cp
que copie un directorioa
ya/.somedotfile
está contenido ena
. sib
existe, este comando creará una copia exacta dea
atb/a
.cp -R /some/dir/* /another/dir
Recuerde que, por defecto,
cp
copia el primer directorio en el segundo directorio si existe el segundo.Por ejemplo
cp -r a b
, copiará el directorioa
enb
. Sib
no existe, se creará con el contenido dea
.Si desea copiar el contenido de
a
enb
(por ejemplo, al copiar un sistema de archivos completo en un punto de montaje) use:como en la respuesta anterior
Tenga en cuenta también que
-a
, utilizado en algunas de las otras respuestas, es el mismo-dr --preserve=all
y conservará las marcas de tiempo, el contexto y los atributos extendidos.fuente
/.
trabajo?a/.
representa el contenido del directorio 'a' en oposición al directorio en sí, en la mayoría de las situaciones es sinónimo, pero cuando se usacp -r
, evita el comportamiento predeterminado de cp (copiando un INTO b).A menos que haya reconfigurado seriamente su caparazón, el patrón de bloqueo '*' no coincide '.' o '...', como puede verificar con solo echo *. Lo que hace es omitir archivos cuyo nombre comienza con un '.', Por lo que su enfoque perderá todos los archivos ocultos. Puede ajustar parte de este comportamiento con las opciones de shell, por ejemplo, la opción dotglob en bash, pero no será la opción portátil y robusta que está buscando.
Si necesita hacer esto más de una o dos veces, le recomiendo que busque en rsync o al unísono (dependiendo de las necesidades específicas) con especificaciones de origen y destino cuidadosamente elaboradas.
Otra alternativa es colocar el directorio de origen en un tarball y descomprimirlo sobre el directorio de destino existente.
fuente
( cd /src/dir ; tar cf - . ) | ( cd /dest/dir ; tar xf - )
... eltar cf - .
tar es el directorio fuente, incluidos los archivos de puntos, y lo escupe a STDOUT, que se canaliza al STDIN deltar xf -
.Esto copiará los archivos normales y ocultos, al tiempo que excluye el directorio principal (
..
):Si no excluye el directorio principal, también terminará con todo el contenido de
..
su directorio de destino.fuente
..
(por ejemplo,...
o..super-hidden
).Para copiar archivos que comienzan con un punto, simplemente haga cp. * Target /
Tan fácil es hacer el comando cp dos veces.
Como dice Peter Eisentraut, las reglas normales de globbing no incluyen ... y. (hm, ¿cómo terminar esta oración?;)
Simplemente use -r para hacerlo recursivo y -i para hacer que cp pregunte si realmente desea sobrescribir un archivo.
fuente
*
lo general , no coincide.
o..
, pero lo hace si lo usa.*
. Tratarecho .*
. Puede excluir.
y..
con el siguiente patrón:.[^.]*
..[^.]*
aún excluye los nombres que comienzan con..
(por ejemplo,...
o..super-hidden
).Esto funciona para copiar todos los archivos y directorios, excepto los directorios ocultos recursivamente desde el directorio actual a donde sea:
fuente