Comment copier un dossier en préservant les droits des propriétaires et des autorisations?

378

J'allais donc sauvegarder mon dossier personnel en le copiant sur un lecteur externe comme suit:

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

Il en résulte que tous les dossiers des lecteurs externes sont maintenant la propriété de root:root. Comment puis-je cpconserver la propriété et les autorisations de l'original?

Psachnodaimonia
la source
23
Oui, je suis content qu'il soit demandé, car Google est toujours plus rapide que 'man' :-).
Stijn Geukens
3
Je suis content qu'il ait demandé aussi
Ole
5
@StijnGeukens Ce n'est même pas Google qui est plus rapide, c'est que même manpour moi, c'est cryptique. Dans ce cas, manà -rdit same as --preserve=mode,ownership,timestamps. Comment étais-je supposé savoir que cela signifiait conserver les autorisations d'origine!?
Kolob Canyon
@ KolobCanyon vous voulez dire à-p
tempête

Réponses:

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

De la page de manuel 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
la source
129
Bien mieux utiliser cp -a. Cela inclut également le -rdrapeau ecursif, mais il fait plus que cela: il préserve tout du fichier; Attributs SELinux, liens, xattr, tout. C'est le "mode archive". Il existe de meilleurs outils pour effectuer une sauvegarde, mais si vous utilisez cppour une sauvegarde, n'utilisez rien d'autre que cp -a.
Wildcard
25
Cela fonctionne, mais la patience est bonne ici. La commande ne mettra tout en place que lorsqu'elle sera finie: tant que vous copiez un répertoire et que vous exécutez cp en tant que root, le répertoire appartiendra à root. Il ne le définira que sur les bonnes autorisations lorsqu'il aura terminé avec ce répertoire.
Paul
4
cp -ane fonctionne pas sur certains systèmes: par exemple, OS X, où (dans certaines versions au moins), il faut en utiliser un cp -pR. Sur mon système OS X actuel cependant (10.10.15), cp -asemble être honoré.
dubiousjim
Si j’utilise cp -a pour copier une structure de dossiers, diff <(getfacl -R folder1) <(getfacl -R folder2)j’ai l’impression que différentes listes de contrôle d’accès
apparaissent
pourquoi avez-vous raison "cp -rp", pas "cp -p"?
Eugene Kaurov
94

Vous pouvez également utiliser rsync.

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

De la rsyncpage de manuel:

 -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.

Voir cette question pour une comparaison entre cpet rsync: https://stackoverflow.com/q/6339287/406686

Notez les barres obliques (voir la page de manuel pour plus de détails).

étudiant
la source
4
+1, cp -pest agréable, mais j'aime rsyncest sortie beaucoup plus en général que j'ai Aliased pcpà time rsync --progress -ah. Signifie «copie de progrès» dans mon esprit. Et les deux acceptent -r, donc cela fonctionne bien pour une utilisation générale du terminal - mais malheureusement, pas en combinaison avec ce sudoqui est montré dans cette question / réponse.
Izkata
15
NB rsync -a:, ne conserve pas les attributs étendus ( -X) et pas de liste de contrôle d'accès ( -A) - la description courte dit archive mode; equals -rlptgoD (no -H,-A,-X). Par exemple, les contextes SELinux ne seront pas conservés sans -X. Dans de nombreux cas d'utilisation, c'est correct, mais si vous effectuez une sauvegarde de votre partition système, l'option -X manquante risque de se briser énormément. Autant que je sache, cp -aconserve vraiment tous les attributs de fichier.
Perséides
2
Je viens de tester cela, tout en sudo cp -apréservant la propriété et les groupes, en les sudo rsync -amodifiant en tant que root. Donc, @Perseids est correct.
John Hamilton
3
@JohnHamilton Under Mint, cela fonctionne parfaitement ... cela ne change que la propriété et les groupes plus tard (je ne sais pas quand). Je viens de copier tout mon /homedossier rsync -aX /home /mnt/sdd/et cela a fonctionné à merveille.
Olivier Pons
@ JohnHamilton, ce n'est pas du tout ce que Perséides a dit.
user643011
60
cp -a

-aest l'abréviation de --archive- en gros, il copie un répertoire exactement tel qu'il est; les fichiers conservent tous leurs attributs et les liens symboliques ne sont pas déréférencés ( -d).

De man cp:

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

J'utilise cp -pdRxqui -pconserve le mode, la propriété et l'horodatage, -dpréserve les liens (pour que vous obteniez des liens symboliques au lieu du contenu du fichier copié), -Rfaites-le récursivement et -xrestez sur un système de fichiers (utile uniquement si vous copiez /ou quelque chose avec un point de montage actif ).

PS: -Rau lieu d’ -rêtre une habitude à utiliser ls -lR.

StarNamer
la source
2
cp -axest une version légèrement plus courte de la même chose. Cela a bien fonctionné - merci!
EM0
En fait, il y a une différence entre -ret -R. Consultez la page de manuel (même la partie trop longue pour être citée ici).
Geckon
2
Je ne pense pas que ce soit le cas (bien que certaines versions d’Unix aient été et puissent toujours l'être). Voir man7.org/linux/man-pages/man1/cp.1.html Cela dit simplement -R, -r, --recursive copy directories recursively.
StarNamer
14

cpa une option pour conserver la propriété du fichier. De la page de manuel 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
la source
11

Vous pouvez faire quelque chose comme ça:

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

tarconserve les autorisations, la propriété et la structure de répertoires intacts, mais convertit tout en un flux d'octets. Vous exécutez un "sous-shell" (les commandes entre parenthèses) qui changent de répertoire, puis vous devez tarinverser la conversion. Un flux d'octets devient des répertoires et des fichiers avec la propriété et les autorisations appropriées.

Bruce Ediger
la source
7

La réponse est simple: cpdispose d'une -poption qui préserve les autorisations (voici un poisson).

Mais comme le dit Wojtek dans son commentaire, man cp(lire le manuel détaillé) serait un bon point de départ (vous voulez apprendre à pêcher?).

bouclier
la source
1

vous pouvez utiliser preserve = all, votre copie conservera tous les attributs tels que propriétaire, groupe et horodatage de vos fichiers. Alors, faites votre sauvegarde en toute sécurité avec la commande suivante.

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