¿Cómo copio una carpeta manteniendo intactos los propietarios y los permisos?

379

Así que iba a hacer una copia de seguridad de mi carpeta de inicio copiándola en una unidad externa de la siguiente manera:

sudo cp -r /home/my_home /media/backup/my_home

Con el resultado de que todas las carpetas en las unidades externas ahora son propiedad de root:root. ¿Cómo puedo cpmantener la propiedad y los permisos del original?

Psachnodaimonia
fuente
23
Sí, lo haría, me alegra que lo haya preguntado porque Google sigue siendo más rápido que 'man' :-).
Stijn Geukens
3
Me alegro de que él también preguntara
Ole
55
@StijnGeukens Ni siquiera es que google sea más rápido, es que incluso manpara mí es críptico. En este caso, manen -rdice same as --preserve=mode,ownership,timestamps. ¿Cómo se suponía que debía saber eso significa mantener los permisos originales?
Kolob Canyon
@KolobCanyon te refieres a-p
tormenta

Respuestas:

455
sudo cp -rp /home/my_home /media/backup/my_home

Desde la página de manual de cp:

 -p     same as --preserve=mode,ownership,timestamps

 --preserve[=ATTR_LIST]
          preserve the specified attributes (default: mode,ownership,timestamps),
          if possible additional attributes: context, links, xattr, all
guido
fuente
129129
Mucho mejor de usar cp -a. Esto también incluye la -rbandera ecursiva, pero hace más que eso: conserva todo sobre el archivo; Atributos de SELinux, enlaces, xattr, todo. Es "modo de archivo". Hay mejores herramientas para hacer una copia de seguridad, pero si está utilizando cpuna copia de seguridad, no use otra cosa que no sea cp -a.
Comodín el
25
Funciona, pero la paciencia es buena aquí. El comando solo configurará todo correctamente cuando termine: mientras sigue copiando un directorio y está ejecutando cp como root, el directorio será propiedad de root. Solo lo establecerá con los permisos correctos cuando termine con este directorio.
Paul
44
cp -ano funciona en algunos sistemas: por ejemplo, OS X, donde (al menos en algunas versiones) uno necesitaba usar cp -pR. Sin embargo, en mi sistema OS X actual (10.10.15), cp -aparece ser honrado.
dubiousjim
Si uso cp -a para copiar una estructura de carpetas, entonces uso diff <(getfacl -R folder1) <(getfacl -R folder2)parece que obtendré diferentes listas de control de acceso :(
philx_x
¿Por qué tienes razón "cp -rp", no "cp -p"?
Eugene Kaurov
94

También puedes usar rsync.

sudo rsync -a /home/my_home/ /media/backup/my_home/

Desde la página del rsyncmanual:

 -a, --archive
              This  is  equivalent  to  -rlptgoD.  It  is a quick way of saying you want
              recursion and want to preserve almost everything (with -H being a  notable
              omission).    The   only  exception  to  the  above  equivalence  is  when
              --files-from is specified, in which case -r is not implied.

              Note that -a does not preserve hardlinks, because finding  multiply-linked
              files is expensive.  You must separately specify -H.

Vea esta pregunta para una comparación entre cpy rsync: https://stackoverflow.com/q/6339287/406686

Tenga en cuenta las barras inclinadas (consulte la página de manual para más detalles).

estudiante
fuente
44
1, cp -pes agradable, pero me gusta rsync's de salida mucho más en general que he alias pcpa time rsync --progress -ah. Significa "copia de progreso" en mi mente. Y ambos aceptan -r, por lo que funciona bien para el uso general del terminal, pero desafortunadamente, no en combinación con lo sudoque se muestra en esta pregunta / respuesta.
Izkata
15
NB: rsync -ano conserva los atributos extendidos ( -X) y no tiene ACL ( -A), dice la breve descripción archive mode; equals -rlptgoD (no -H,-A,-X). Por ejemplo, los contextos SELinux no se conservarán sin él -X. Para muchos casos de uso, esto está bien, pero si realiza una copia de seguridad de la partición de su sistema, la falta de -X podría romperse bastante. Que yo sepa, cp -arealmente conserva todos los atributos del archivo.
Perseidas
2
Acabo de probar esto, mientras sudo cp -aconserva la propiedad y los grupos, los sudo rsync -acambia a raíz. Entonces, @Perseids es correcto.
John Hamilton
3
@JohnHamilton Under Mint, esto funciona perfectamente ... solo cambia la propiedad y los grupos más adelante (no puedo decir cuándo). Acabo de copiar toda mi /homecarpeta rsync -aX /home /mnt/sdd/y funcionó de maravilla.
Olivier Pons
@JohnHamilton eso no es lo que dijo Perseides en absoluto.
user643011
60
cp -a

Where -aes la abreviatura de --archive: básicamente copia un directorio exactamente como es; los archivos retienen todos sus atributos y los enlaces simbólicos no están desreferenciados ( -d).

De man cp:

   -a, --archive
          same as -dR --preserve=all
Zaz
fuente
21

Utilizo el cp -pdRxcual -pconservará el modo, la propiedad y las marcas de tiempo, -dconservará los enlaces (para que obtenga enlaces simbólicos en lugar de copiar el contenido del archivo), lo -Rhaga de forma recursiva y -xpermanezca en un sistema de archivos (solo realmente útil si está copiando /o algo con un punto de montaje activo )

PD: en -Rlugar de -rsolo es costumbre de usar ls -lR.

StarNamer
fuente
2
cp -axes una versión un poco más corta de lo mismo. Esto funcionó muy bien, ¡gracias!
EM0
En realidad hay una diferencia entre -ry -R. Consulte la página de manual (incluso la parte en particular es demasiado larga para ser citada aquí).
geckon
2
No creo que la haya (aunque alguna vez haya existido y pueda haber en algunas versiones de Unix). Ver man7.org/linux/man-pages/man1/cp.1.html Simplemente dice -R, -r, --recursive copy directories recursively.
StarNamer
14

cptiene una opción para preservar la propiedad del archivo. De la página del manual de cp:

-p    Cause cp to preserve the following attributes of each source file in the copy: modification
      time, access time, file flags, file mode, user ID, and group ID, as allowed by permissions.
      Access Control Lists (ACLs) and Extended Attributes (EAs), including resource forks, will also
      be preserved.
Matteo
fuente
11

Puedes hacer algo como esto:

tar cf - my_home | (cd /media/backup; sudo tar xf - )

tarmantiene intactos los permisos, la propiedad y la estructura del directorio, pero convierte todo en una secuencia de bytes. Ejecutas una "subshell" (los comandos entre paréntesis) que cambian de directorio y luego tarinvierten la conversión. Un vapor de bytes se convierte en directorios y archivos con la propiedad y los permisos correctos.

Bruce Ediger
fuente
7

La respuesta es simple: cptiene una -popción que conserva los permisos (aquí hay un pez).

Pero como dice Wojtek en su comentario, man cp(leer el excelente manual) sería un buen punto de partida (¿quieres aprender a pescar?).

ciervo
fuente
1

puede usar preserve = all, luego su copia mantendrá todos los atributos como propietario, grupo y marca de tiempo de sus archivos. Entonces, haga su copia de seguridad de forma segura con el siguiente comando.

cp -r --preserve=all /home/my_home /media/backup/my_home
Majid Zarrin
fuente