Bagaimana cara menyalin folder yang menjaga pemilik dan izin tetap utuh?

379

Jadi saya akan mencadangkan folder rumah saya dengan menyalinnya ke drive eksternal sebagai berikut:

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

Dengan hasilnya semua folder pada drive eksternal sekarang dimiliki oleh root:root. Bagaimana saya bisa cpmenjaga kepemilikan dan izin dari yang asli?

Psachnodaimonia
sumber
23
Ya, tentu saja, saya senang dia bertanya karena google masih lebih cepat dari 'man' :-).
Stijn Geukens
3
Aku senang dia juga bertanya
Ole
5
@StijnGeukens Bukan karena Google lebih cepat, bahkan manbagi saya itu samar. Dalam hal ini, mandi -rkata same as --preserve=mode,ownership,timestamps. Bagaimana aku bisa tahu bahwa itu berarti menjaga izin asli !?
Ngarai Kolob
@KolobCanyon yang Anda maksud di-p
storm

Jawaban:

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

Dari manual 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
sumber
129
Jauh lebih baik untuk digunakan cp -a. Ini juga termasuk -rflag ecursive, tetapi ia melakukan lebih dari itu — ia mempertahankan segalanya tentang file; Atribut SELinux, tautan, xattr, semuanya. Ini "mode arsip." Ada alat yang lebih baik untuk membuat cadangan, tetapi jika Anda menggunakan cpuntuk cadangan, jangan gunakan selain cp -a.
Wildcard
25
Itu bekerja, tetapi Kesabaran Baik di sini. Perintah hanya akan mengatur semuanya dengan benar ketika selesai: Meskipun masih menyalin direktori, dan Anda menjalankan cp sebagai root, direktori tersebut akan dimiliki oleh root. Ini hanya akan mengaturnya ke izin yang tepat ketika selesai dengan direktori ini.
Paul
4
cp -atidak berfungsi pada beberapa sistem: mis. OS X, di mana (setidaknya dalam beberapa versi) yang dibutuhkan untuk digunakan cp -pR. Pada sistem OS X saya saat ini (10.10.15), cp -atampaknya merasa terhormat.
dubiousjim
Jika saya menggunakan cp -a untuk menyalin struktur folder maka gunakan diff <(getfacl -R folder1) <(getfacl -R folder2)tampaknya masih mendapatkan daftar kontrol akses yang berbeda :(
philx_x
mengapa Anda benar "cp -rp", bukan "cp -p"?
Eugene Kaurov
94

Anda juga bisa menggunakan rsync.

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

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

Lihat pertanyaan ini untuk perbandingan antara cpdan rsync: https://stackoverflow.com/q/6339287/406686

Perhatikan garis miring trailing (lihat halaman manual untuk detail).

siswa
sumber
4
1, cp -pbagus, tapi aku suka rsync's output yang jauh lebih umum bahwa saya telah alias pcpuntuk time rsync --progress -ah. Singkatan dari "copy kemajuan" dalam pikiran saya. Dan keduanya menerima -r, jadi ini berfungsi baik untuk penggunaan terminal umum - tetapi sayangnya, tidak dalam kombinasi dengan sudoseperti yang ditunjukkan dalam pertanyaan / jawaban ini.
Izkata
15
NB:, rsync -atidak mempertahankan atribut diperluas ( -X) dan tidak ada ACL ( -A) - deskripsi singkat mengatakan archive mode; equals -rlptgoD (no -H,-A,-X). Misalnya, konteks SELinux tidak akan dipelihara tanpa -X. Untuk banyak kasus penggunaan, ini baik-baik saja, tetapi jika Anda membuat cadangan dari partisi sistem Anda, hilang -X mungkin rusak cukup banyak. Sejauh yang saya tahu, cp -abenar-benar mempertahankan semua atribut file.
Perseid
2
Hanya menguji ini, sambil sudo cp -amempertahankan kepemilikan dan grup, sudo rsync -amengubahnya menjadi root. Jadi, @Perseids benar.
John Hamilton
3
@JohnHamilton Under Mint, ini berfungsi dengan baik ... hanya mengubah kepemilikan dan grup nanti (saya tidak tahu kapan). Saya baru saja menyalin seluruh /homefolder saya rsync -aX /home /mnt/sdd/dan itu berfungsi seperti pesona.
Olivier Pons
@ JohnHamilton bukan itu yang dikatakan Perseides sama sekali.
user643011
60
cp -a

Di mana -akependekan --archive- pada dasarnya menyalin direktori persis seperti apa adanya; file mempertahankan semua atributnya, dan symlink tidak dereferenced ( -d).

Dari man cp:

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

Saya menggunakan cp -pdRxyang akan -pmempertahankan mode, kepemilikan & cap waktu, -dmelestarikan tautan (sehingga Anda mendapatkan symlink alih-alih isi file disalin), -Rlakukan secara rekursif dan -xtetap menggunakan satu sistem file (hanya sangat berguna jika Anda menyalin /atau sesuatu dengan titik mount aktif) ).

PS: -RBukan -rhanya kebiasaan menggunakan ls -lR.

StarNamer
sumber
2
cp -axadalah versi yang sedikit lebih pendek dari hal yang sama. Ini bekerja dengan baik - terima kasih!
EM0
Sebenarnya ada perbedaan antara -rdan -R. Periksa halaman manual (bahkan bagian tertentu terlalu lama untuk dikutip di sini).
tokek
2
Saya tidak berpikir ada (meskipun mungkin pernah dan mungkin masih ada di beberapa versi Unix). Lihat man7.org/linux/man-pages/man1/cp.1.html Ini hanya mengatakan -R, -r, --recursive copy directories recursively.
StarNamer
14

cpmemiliki opsi untuk mempertahankan kepemilikan file. Dari halaman manual 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
sumber
11

Anda dapat melakukan sesuatu seperti ini:

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

tarmenjaga izin, kepemilikan, dan struktur direktori tetap utuh, tetapi mengubah semuanya menjadi aliran byte. Anda menjalankan "subkulit" (perintah yang di-kurung) yang mengubah direktori, dan kemudian bisa tarmembalikkan konversi. Setumpuk byte menjadi direktori dan file dengan kepemilikan dan izin yang benar.

Bruce Ediger
sumber
7

Jawabannya sederhana: cpmemiliki -popsi yang mempertahankan izin (inilah seekor ikan).

Tetapi seperti yang dikatakan Wojtek dalam komentarnya, man cp(membaca manual yang bagus) akan menjadi titik awal yang baik (ingin belajar cara memancing?).

buckdeer
sumber
1

Anda dapat menggunakan preserve = all, maka salinan Anda akan menyimpan semua atribut seperti pemilik, grup, dan timestamp file Anda. Jadi, lakukan pencadangan dengan aman dengan perintah berikut.

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