Come faccio a copiare una cartella mantenendo intatti i proprietari e le autorizzazioni?


379

Quindi stavo per eseguire il backup della mia cartella principale copiandola su un'unità esterna come segue:

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

Di conseguenza, tutte le cartelle sulle unità esterne sono ora di proprietà di root:root. Come posso cpmantenere la proprietà e le autorizzazioni dall'originale?


23
Sì, sarei felice di averlo chiesto perché google è ancora più veloce di "uomo" :-).
Stijn Geukens,

3
Sono contento che abbia chiesto anche a lui
Ole

5
@StijnGeukens Non è nemmeno che Google sia più veloce, è che anche manper me è criptico. In questo caso, mana -rdice same as --preserve=mode,ownership,timestamps. Come avrei dovuto sapere che significa mantenere i permessi originali !?
Kolob Canyon,

@KolobCanyon intendi a-p
storm

Risposte:


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

Dalla manpage 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

129
Molto meglio da usare cp -a. Questo include anche il -rflag ecursive, ma fa di più: conserva tutto ciò che riguarda il file; Attributi, collegamenti, xattr di SELinux, tutto. È "modalità archivio". Esistono strumenti migliori per eseguire un backup, ma se si utilizza cpper un backup, non utilizzare altro cp -a.
Wildcard il

25
Funziona, ma qui la pazienza è buona. Il comando imposterà tutto correttamente al termine: mentre sta ancora copiando una directory e stai eseguendo cp come root, la directory sarà di proprietà di root. Lo imposterà con le autorizzazioni giuste al termine con questa directory.
Paul,

4
cp -anon funziona su alcuni sistemi: ad esempio OS X, dove (almeno in alcune versioni) è necessario utilizzarne uno cp -pR. Sul mio attuale sistema OS X (10.10.15), cp -asembra essere onorato.
dubiousjim,

Se uso cp -a per copiare una struttura di cartelle, allora uso diff <(getfacl -R folder1) <(getfacl -R folder2)i davanzali sembrano ottenere diversi elenchi di controllo di accesso :(
philx_x

perché hai ragione "cp -rp", non "cp -p"?
Eugene Kaurov,

94

Puoi anche usare rsync.

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

Dalla rsyncmanpage:

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

Vedi questa domanda per un confronto tra cpe rsync: https://stackoverflow.com/q/6339287/406686

Nota le barre finali (vedi la manpage per i dettagli).


4
+1, cp -pè bello, ma mi piace rsyncs' uscita in modo molto più in generale, che ho un alias pcpa time rsync --progress -ah. Sta per "copia di progresso" nella mia mente. Entrambi accettano -r, quindi funziona bene per l'utilizzo generale del terminale - ma sfortunatamente, non in combinazione con sudocome mostrato in questa domanda / risposta.
Izkata,

15
NB rsync -a:, non conserva gli attributi estesi ( -X) e nessun ACL ( -A) - dice la breve descrizione archive mode; equals -rlptgoD (no -H,-A,-X). Ad esempio, i contesti SELinux non saranno conservati senza -X. Per molti casi d'uso questo va bene, ma se si esegue un backup della partizione di sistema, manca -X potrebbe rompersi parecchio. Per quanto ne so, cp -aconserva davvero tutti gli attributi dei file.
Perseidi,

2
Ho appena testato questo, pur sudo cp -apreservando proprietà e gruppi, sudo rsync -ali cambia in root. Quindi, @Perseids è corretto.
John Hamilton,

3
@JohnHamilton Under Mint, funziona perfettamente ... cambia solo proprietà e gruppi in seguito (non so quando). Ho appena copiato tutta la mia /homecartella rsync -aX /home /mnt/sdd/e ha funzionato come un fascino.
Olivier Pons,

@JohnHamilton non è quello che ha detto Perseides.
user643011

60
cp -a

Dov'è l' -aabbreviazione --archive: sostanzialmente copia una directory esattamente com'è; i file mantengono tutti i loro attributi e i collegamenti simbolici non sono dereferenziati ( -d).

Da man cp:

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

21

Uso cp -pdRxciò che -pconserverà modalità, proprietà e timestamp, -dpreserverà i collegamenti (in modo da ottenere collegamenti simbolici anziché il contenuto del file copiato), -Rfarlo ricorsivamente e -xrimanere su un file system (davvero utile solo se stai copiando /o qualcosa con un punto di montaggio attivo ).

PS: -Rinvece di -rusare l'abitudine ls -lR.


2
cp -axè una versione leggermente più corta della stessa cosa. Ha funzionato alla grande - grazie!
EM0

In realtà c'è una differenza tra -re -R. Controlla la pagina man (anche la parte particolare troppo lunga per essere citata qui).
Geckon,

2
Non credo che ci sia (anche se potrebbe esserci stato una volta e potrebbe essere ancora presente in alcune versioni di Unix). Vedi man7.org/linux/man-pages/man1/cp.1.html Dice semplicemente -R, -r, --recursive copy directories recursively.
StarNamer,

14

cpha un'opzione per preservare la proprietà dei file. Dalla pagina del manuale di 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.

11

Puoi fare qualcosa del genere:

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

tarmantiene intatte le autorizzazioni, la proprietà e la struttura delle directory, ma converte tutto in un flusso di byte. Si esegue una "subshell" (i comandi tra parentesi) che cambia directory e quindi si tarinverte la conversione. Una serie di byte diventa directory e file con proprietà e autorizzazioni corrette.


7

La risposta è semplice: cpha -pun'opzione che conserva i permessi (ecco un pesce).

Ma come dice Wojtek nel suo commento, man cp(leggendo il manuale) sarebbe un buon punto di partenza (vuoi imparare a pescare?).


1

puoi usare preserv = all, quindi la tua copia manterrà tutti gli attributi come proprietario, gruppo e data e ora dei tuoi file. Quindi, esegui il backup in modo sicuro con il seguente comando.

cp -r --preserve=all /home/my_home /media/backup/my_home
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.