2009-10-27 19:46:06 +0000 2009-10-27 19:46:06 +0000
423
423

¿Cómo copiar con cp para incluir archivos y directorios ocultos y su contenido?

¿Cómo puedo hacer que cp -r copie absolutamente todos los archivos y directorios de un directorio

Requisitos:

  • Incluir archivos y directorios ocultos.
  • Ser un solo comando con una bandera para incluir lo anterior.
  • No es necesario depender de la coincidencia de patrones en absoluto.

Mi feo, pero que funciona, hack es:

cp -r /etc/skel/* /home/user
cp -r /etc/skel/.[^.]* /home/user

¿Cómo puedo hacer todo esto en un solo comando sin la coincidencia de patrones? ¿Qué bandera debo usar?

Respuestas (14)

492
492
492
2011-12-12 22:00:01 +0000

Digamos que has creado la nueva carpeta (o que vas a crear una) y quieres copiar los archivos a ella después de que se cree la carpeta

mkdir /home/<new_user>
cp -r /etc/skel/. /home/<new_user>

Esto copiará todos los archivos/carpeta de forma recursiva desde /etc/skel a la carpeta ya existente creada en la primera línea.

281
281
281
2009-10-27 19:55:27 +0000

No especifique los archivos:

cp -r /etc/skel /home/user

(Tenga en cuenta que /home/user no debe existir ya, o de lo contrario creará /home/user/skel.)

95
95
95
2015-09-08 21:50:45 +0000

El medio correcto para hacerlo es utilizar la opción -T (--no-target-directory), y copiar recursivamente las carpetas (sin barras, asteriscos, etc.), es decir:

cp -rT /etc/skel /home/user

Esto copiará el contenido de /etc/skel a /home/user (incluyendo los archivos ocultos), creando la carpeta /home/user si no existe; sin embargo la opción -T impide que el contenido de /etc/skel se copie a una nueva carpeta /home/user/skel si la carpeta /home/user existe.

68
68
68
2013-02-06 01:14:47 +0000

bash en sí mismo tiene una buena solución, tiene un shell option, puedes cp, mv y así sucesivamente:

shopt -s dotglob # for considering dot files (turn on dot files)

y

shopt -u dotglob # for don't considering dot files (turn off dot files)

La solución de arriba es estándar de bash

NOTA:

shopt # without argument show status of all shell options
-u # abbrivation of unset 
-s # abbrivation of set
29
29
29
2014-02-20 13:18:25 +0000

Use rsync:

rsync -rtv source_folder/ destination_folder/

7
7
7
2014-08-28 17:46:19 +0000

rsync es bueno, pero otra opción:

cp -a src/ dst/

De la ayuda principal:

-a, --archive
          same as -dR --preserve=all

   -d same as --no-dereference --preserve=links

   -R, -r, --recursive
          copy directories recursively
5
5
5
2018-06-06 16:13:41 +0000

La forma más simple es:

cp -r /etc/skel/{.,}* /home/user

La expresión {.,}* incluye todos los archivos y directorios (también empezando con un punto).

Si no quieres usar la expresión anterior, entonces puedes usar la propiedad cp, que es la capacidad de especificar múltiples fuentes para una carpeta de destino:

cp -r /etc/skel/* /etc/skel/.* /home/user
4
4
4
2016-01-17 17:32:26 +0000

Puedes usar rsync.

rsync -aP ./from/dir/ /some/other/directory/

Incluso puedes copiar sobre ssh

rsync -aP ./from/dir/ username@remotehost:/some/other/directory/

Hay varias banderas que puedes usar: -a, –archivo # archivo (-rlptgoD)

-r, --recursive
-l, --links # copy symlinks as links
-p, --perms # preserve permissions
-t, --times # preserve times
-g, --group # preserve group
-o, --owner # preserve owner
-D # --devices --specials

--delete # Delete extra files

You may want to add the -P option to your command.

--partial # By default, rsync will delete any partially transferred file if the transfer is interrupted. In some circumstances it is more desirable to keep partially transferred files. Using the --partial option tells rsync to keep the partial file which should make a subsequent transfer of the rest of the file much faster.

-P # The -P option is equivalent to --partial --progress. Its purpose is to make it much easier to specify these two options for a long transfer that may be interrupted.

Rsync man page

4
4
4
2013-05-16 08:38:46 +0000

Si el directorio de origen y el de destino tienen el mismo nombre, incluso si el directorio de destino existe, puedes simplemente escribir:

cp -R /etc/skel /home/

Esto copiará el directorio /etc/skel en /home/, incluyendo los archivos y directorios ocultos.

Eventualmente, puedes copiar el directorio y renombrarlo en una sola línea :

cp -R /etc/skel /home/ && mv /home/skel /home/user
3
3
3
2015-07-24 13:34:27 +0000

Vine aquí buscando en Google la solución al mismo problema, y me di cuenta de que es fácil de encontrar. La ventaja es que no depende del shell, o de utilidades especiales que pueden no estar instaladas.

find /etc/skel/ -mindepth 1 -exec cp -r {} /home/username/ \;

Probé el truco de la barra de arrastre, pero no funcionó para mí.

2
2
2
2018-01-30 20:42:49 +0000

Mi solución para este problema cuando tengo que copiar todos los archivos (incluyendo los archivos .) a un directorio de destino reteniendo los permisos es: (sobrescribir si ya existe)

yes | cp -rvp /source/directory /destination/directory/

yes es para sobrescribir automáticamente los archivos de destino, r recursivo, v verboso, p conservando los permisos.

Fíjese que la pista de origen no termina con un / (por lo que todos los archivos/directorio y los archivos . se copian)

directorio de destino termina con / ya que estamos colocando el contenido de la carpeta de origen a destino en su totalidad.

2
2
2
2015-05-12 20:00:58 +0000

Observe que hay un truco de línea de comandos (funciona en, al menos, sh, bash, y ksh): Sólo tienes que poner el sufijo en el directorio from con una barra. Esto verterá el contenido del directorio from en el directorio to (irónicamente, yo había aprendido por primera vez sobre este truco cuando usaba rsync).

Ejemplo:

/tmp$ mkdir test_dir1
/tmp$ cd test_dir1/
/tmp/test_dir1$ touch aa
/tmp/test_dir1$ touch .bb
/tmp/test_dir1$ cd ..
/tmp$ mkdir test_dir2

/tmp$ cp -r test_dir1/* test_dir2
/tmp$ ls -1a test_dir2
.
..
aa

/tmp$ cp -r test_dir1/ test_dir2
/tmp$ ls -1a test_dir2
.
..
.bb
aa
1
1
1
2019-02-13 10:18:49 +0000

He visto que el cp no siempre copia los archivos ocultos y si quieres un comando que parece funcionar en todos los dialectos de linux/unix deberías intentar usar:

cd /etc/skel
find | cpio -pdumv /home/user
-2
-2
-2
2016-12-14 21:57:06 +0000

A partir de al menos K3b 2.0.3, hay un cuadro de preguntas que aparece cuando se agrega el directorio al proyecto, que pregunta si se quieren incluir archivos ocultos… también hay una pregunta que aparece para preguntar sobre la inclusión de enlaces. Qué bien!