Como copiar uma pasta mantendo intactos os proprietários e as permissões?

379

Então, eu estava indo para fazer backup da minha pasta pessoal, copiando-a para uma unidade externa da seguinte maneira:

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

Com o resultado de que todas as pastas nas unidades externas agora pertencem root:root. Como posso cpmanter a propriedade e as permissões do original?

Psachnodaimonia
fonte
23
Sim, ficaria feliz que ele perguntou porque o Google ainda é mais rápido que 'man' :-).
Stijn Geukens
3
Estou feliz que ele pediu também
Ole
5
@StijnGeukens Nem mesmo o google é mais rápido, é que até manpara mim é enigmático. Neste caso, mana -rdiz same as --preserve=mode,ownership,timestamps. Como eu deveria saber que isso significa manter as permissões originais !?
precisa
@KolobCanyon você quer dizer at-p
storm

Respostas:

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

Na página de manual do 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
fonte
129
Muito melhor para usar cp -a. Isso também inclui a -rbandeira ecursiva, mas faz mais do que isso - preserva tudo sobre o arquivo; Atributos SELinux, links, xattr, tudo. É "modo de arquivo". Existem ferramentas melhores para fazer um backup, mas se você estiver usando cpum backup, não use outra coisa senão cp -a.
Wildcard
25
Funciona, mas a paciência é boa aqui. O comando definirá tudo certo quando terminar: Enquanto ele ainda estiver copiando um diretório e você estiver executando o cp como root, o diretório será de propriedade do root. Ele só definirá as permissões corretas quando terminar com este diretório.
Paul
4
cp -anão funciona em alguns sistemas: por exemplo, OS X, onde (em algumas versões pelo menos) é necessário usar cp -pR. No meu atual sistema OS X (10.10.15), cp -aparece ser honrado.
precisa saber é o seguinte
Se eu usar cp -a para copiar uma estrutura de pastas, use diff <(getfacl -R folder1) <(getfacl -R folder2)i sill para obter diferentes listas de controle de acesso :(
philx_x
por que você corrige "cp -rp", não "cp -p"?
Eugene Kaurov
94

Você também pode usar rsync.

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

Na página de 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.

Consulte esta pergunta para obter uma comparação entre cpe rsync: https://stackoverflow.com/q/6339287/406686

Observe as barras finais (consulte a página de manual para obter detalhes).

aluna
fonte
4
+1, cp -pé bom, mas eu gosto rsyncde saída 's muito mais em geral que eu alias pcppara time rsync --progress -ah. Significa "cópia do progresso" em minha mente. E ambos aceitam -r, por isso funciona bem para uso geral do terminal - mas, infelizmente, não combina com sudoo mostrado nesta pergunta / resposta.
Izkata
15
NB:, rsync -anão preserva atributos estendidos ( -X) e nenhuma ACL ( -A) - a breve descrição diz archive mode; equals -rlptgoD (no -H,-A,-X). Por exemplo, os contextos do SELinux não serão preservados sem -X. Para muitos casos de uso, isso é bom, mas se você fizer um backup da partição do sistema, a falta de -X poderá quebrar bastante. Até onde eu sei, cp -arealmente preserva todos os atributos de arquivo.
Perseids 23/09
2
Acabei de testar isso, enquanto sudo cp -apreserva a propriedade e os grupos, os sudo rsync -atransforma em raiz. Então, @Perseids está correto.
John Hamilton
3
@JohnHamilton Under Mint, isso funciona perfeitamente ... só muda de propriedade e grupos mais tarde (não sei quando). Acabei de copiar minha /homepasta inteira rsync -aX /home /mnt/sdd/e funcionou como um encanto.
Olivier Pons
@JohnHamilton não foi o que Perseides disse.
user643011
60
cp -a

Onde -aé a abreviação --archive- basicamente ele copia um diretório exatamente como é; os arquivos mantêm todos os seus atributos e os links simbólicos não são desreferenciados ( -d).

De man cp:

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

Eu uso o modo cp -pdRxque -ppreserva o modo, a propriedade e os registros de data e hora, -dpreserva os links (para que você obtenha links simbólicos em vez do conteúdo do arquivo copiado), -Rfaça-o recursivamente e -xpermaneça em um sistema de arquivos (apenas realmente útil se você estiver copiando /ou algo com um ponto de montagem ativo )

PS: em -Rvez de -ré apenas o hábito de usar ls -lR.

StarNamer
fonte
2
cp -axé uma versão ligeiramente mais curta da mesma coisa. Isso funcionou muito bem - obrigado!
EM0 25/0315
Na verdade, há uma diferença entre -re -R. Verifique a página do manual (mesmo a parte específica por muito tempo para ser citada aqui).
geckon
2
Eu não acho que exista (embora possa ter existido e ainda possa existir em algumas versões do Unix). Veja man7.org/linux/man-pages/man1/cp.1.html Simplesmente diz -R, -r, --recursive copy directories recursively.
StarNamer
14

cptem uma opção para preservar a propriedade do arquivo. Na página do 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
fonte
11

Você pode fazer algo assim:

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

tarmantém permissões, propriedade e estrutura de diretórios intactas, mas converte tudo em um fluxo de bytes. Você executa um "subshell" (os comandos entre parênteses) que alteram o diretório e, em seguida, consegue tarreverter a conversão. Um vapor de bytes se torna diretórios e arquivos com propriedade e permissões corretas.

Bruce Ediger
fonte
7

A resposta é simples: cptem uma -popção que preserva as permissões (aqui está um peixe).

Mas como Wojtek diz em seu comentário man cp(ler o manual) seria um bom ponto de partida (quer aprender a pescar?).

buckdeer
fonte
1

você pode usar preserve = all, então sua cópia manterá todos os atributos como proprietário, grupo e registro de data e hora de seus arquivos. Portanto, faça seu backup com segurança com o seguinte comando.

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