Pregunta ¿Cómo copiar con cp para incluir archivos ocultos y directorios ocultos y sus contenidos?


¿Cómo puedo hacer cp -r dupdo absolutamente todo de los archivos y directorios en un directorio

Requisitos:

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

Mi feo, pero funcional, truco es:

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

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


294


origen


Más respuestas aquí, aunque no se ven tan bien; serverfault.com/questions/3154/... - Roel Van de Paar
Por favor, Eleven81, considere cambiar la respuesta aceptada a la dada por @bruno pereira, porque evita crear una nueva carpeta. De lo contrario, deje que este comentario sea una advertencia para los lectores nuevos para que también verifiquen la otra respuesta (la más votada). Tx. - Dr Beco


Respuestas:


No especifique los archivos:

cp -r /etc/skel /home/user

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


214



¿Es posible usar algo similar si /home/user/skel  hace ¿existe? - bradley.ayers
@ bradley.ayers Creo que uno podría copiar en un subdirectorio temporal y luego moverlos al nivel superior (ya que moverse en la misma unidad es rápido). Menos que ideal, pero más corto que otras soluciones para mí. - Halil Özgür
@ bradley.ayers La respuesta de Bruno a continuación aborda su pregunta - Mark
Esta solución no funcionó para mí. No copió los archivos ocultos. Estoy usando CentOS versión 6.5. La solución de @ Bruno hizo el truco. - Technext
En ubuntu / debian esto coloca el directorio 'skel' dentro del directorio de destino y no los archivos recursados ​​dentro de skel. Utilizar -T (sin objetivo) por debajo para un uso adecuado. (-rT para recursivo) - bshea


Supongamos que creó la nueva carpeta (o va a crear una) y desea copiar los archivos en ella después de crear la carpeta

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

Esto copiará todos los archivos / carpetas recursivamente de /etc/skel en la carpeta ya existente creada en la primera línea.


378



Si no me equivoqué, esto no copió los archivos ocultos / de puntos. - Halil Özgür
Funciona bien para mi Tenga en cuenta que el '.' es fundamental para que funcione. - Mark
Funciona, pero, ¿por qué? No se puede encontrar una referencia a esto en el manual. - Julien Palard
Creo que funciona porque normalmente, esto crearía una nueva carpeta con el nombre de la última carpeta en el primer argumento. Sin embargo, dado que ese nombre es ., este comportamiento requeriría crear un directorio ya existente, por lo que simplemente se salta ese paso. - Zenexer
@Technext El globbing predeterminado en bash no incluye nombres de archivos que comiencen con un ., para cambiar eso necesitas usar el shopt -s dotglob comando antes para poder incluir esos archivos. Entonces con *, de forma predeterminada, solicita copiar todos los archivos recursivamente desde este directorio que se pueden expandir usando * (que no incluye archivos ocultos por defecto). Mientras que en el otro extremo con . está usando cp para copiar recursivamente todo desde "este directorio". - Bruno Pereira


bash tiene una buena solución, tiene una shell option, Usted puede cp, mv y así.:

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 anterior es estándar de bash

NOTA:

shopt # without argument show status of all shell options
-u # abbrivation of unset 
-s # abbrivation of set

59



Esto es útil cuando quiere copiar solo contenido sin crear un nuevo directorio dentro del destino. Especialmente cuando el dir de destino es el punto de montaje. - kaszynek
Esta es realmente la mejor respuesta y llega al corazón de la pregunta ... - Stephen
Sus setopt para zsh, en caso de que alguien más se esté preguntando. - Pat


La forma correcta de hacerlo es usar el -T (--no-target-directory) opción, y copia recursivamente las carpetas (sin barras inclinadas, asteriscos, etc.), es decir:

cp -rT /etc/skel /home/user

Esto copiará el contenido de /etc/skel a /home/user (incluidos los archivos ocultos), creando la carpeta /home/user si no existe; sin embargo, el -T opción evita el contenido de /etc/skel de ser copiado a una nueva carpeta /home/user/skel debería la carpeta /home/user existe.


45



Respuesta correcta. +1 - bshea
esta fue de hecho la respuesta correcta - Gaetan


Use rsync:

rsync -rtv source_folder/ destination_folder/


23





Si su directorio de origen y de destino tiene el mismo nombre, incluso si existe el directorio de destino, simplemente escriba:

cp -R /etc/skel /home/

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

Eventualmente, puede copiar el directorio y cambiarle el nombre en una sola línea:

cp -R /etc/skel /home/ && mv /home/skel /home/user

3



O simplemente podrías usar cp -r /etc/skel /home/user para cambiar el nombre skel a user... - David
Eso es correcto, solo si / home / user aún no existe. - Gabriel Hautclocq


rsync es bueno, pero es 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

2



Siempre usé cp -r. Gracias por mencionar cp -a - Pinaki Mukherjee