Jak skopiować folder, zachowując nienaruszonych właścicieli i uprawnienia?

377

Chciałem więc wykonać kopię zapasową mojego folderu domowego, kopiując go na dysk zewnętrzny w następujący sposób:

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

W rezultacie wszystkie foldery na dyskach zewnętrznych są teraz własnością root:root. Jak mogę cpzachować własność i uprawnienia w stosunku do oryginału?

Psachnodaimonia
źródło
23
Tak, tak, cieszę się, że zapytał, ponieważ Google wciąż jest szybszy niż „człowiek” :-).
Stijn Geukens
3
Cieszę się, że on też o to poprosił
Ole
5
@StijnGeukens Nie chodzi nawet o to, że Google jest szybszy, ale nawet mandla mnie jest tajemniczy. W tym przypadku mówi manat . Skąd miałem wiedzieć, że oznacza to zachowanie oryginalnych uprawnień !? -rsame as --preserve=mode,ownership,timestamps
Kolob Canyon
@KolobCanyon masz na myśli-p
burza

Odpowiedzi:

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

Z cp manpage:

 -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
źródło
128
O wiele lepszy w użyciu cp -a. Obejmuje to -rtakże flagę ecursive, ale robi więcej niż to - zachowuje wszystko w pliku; Atrybuty SELinuksa, linki, xattr, wszystko. To „tryb archiwizacji”. Istnieją lepsze narzędzia do tworzenia kopii zapasowej, ale jeśli używasz cpdo tworzenia kopii zapasowej, nie używaj niczego innego cp -a.
Wildcard
24
Działa, ale Cierpliwość jest tutaj dobra. Polecenie ustawi wszystko poprawnie tylko po zakończeniu: Podczas gdy nadal kopiuje katalog, a ty używasz cp jako root, katalog będzie własnością root. Ustawi tylko odpowiednie uprawnienia, gdy zakończy pracę z tym katalogiem.
Paul,
4
cp -anie działa na niektórych systemach: np. OS X, gdzie (przynajmniej w niektórych wersjach) trzeba było użyć jednego cp -pR. Jednak w moim obecnym systemie OS X (10.10.15) cp -awydaje się być honorowany.
dubiousjim
Jeśli diff <(getfacl -R folder1) <(getfacl -R folder2)
użyję
dlaczego masz rację „cp -rp”, a nie „cp -p”?
Eugene Kaurov
94

Możesz także użyć rsync.

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

Z strony rsyncpodręcznika:

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

Zobacz to pytanie w celu porównania między cpi rsync: https://stackoverflow.com/q/6339287/406686

Zwróć uwagę na końcowe ukośniki (szczegóły na stronie podręcznika).

student
źródło
4
+1, cp -pjest ładny, ale podoba mi się rsync„s wyjście tyle bardziej ogólnie, że mam alias pcpdo time rsync --progress -ah. W mojej głowie oznacza „kopiowanie postępu”. I oba akceptują -r, więc działa dobrze dla ogólnego użycia terminala - ale niestety nie w połączeniu z, sudojak pokazano w tym pytaniu / odpowiedzi.
Izkata,
15
Uwaga: rsync -anie zachowuje rozszerzonych atrybutów ( -X) i żadnych list ACL ( -A) - mówi krótki opis archive mode; equals -rlptgoD (no -H,-A,-X). Np. Konteksty SELinux nie zostaną zachowane bez -X. W wielu przypadkach użycia jest to w porządku, ale jeśli wykonasz kopię zapasową partycji systemowej, brak -X może się bardzo zepsuć. O ile mi wiadomo, cp -anaprawdę zachowuje wszystkie atrybuty plików.
Perseidy,
2
Właśnie przetestowałem to, sudo cp -azachowując własność i grupy, sudo rsync -azamieniając je w root. Więc @Perseids jest poprawne.
John Hamilton,
3
@JohnHamilton Under Mint, to działa idealnie ... zmienia tylko własność i grupy później (nie wiem kiedy). Właśnie skopiowałem cały /homefolder rsync -aX /home /mnt/sdd/i działało to jak urok.
Olivier Pons,
@JohnHamilton, wcale tak nie powiedział Perseides.
user643011
60
cp -a

Gdzie -ajest skrót --archive- w zasadzie kopiuje katalog dokładnie tak, jak jest; pliki zachowują wszystkie swoje atrybuty, a dowiązania symboliczne nie są usuwane ( -d).

Od man cp:

   -a, --archive
          same as -dR --preserve=all
Zaz
źródło
21

Używam, cp -pdRxktóry -pzachowuje tryb, własność i znaczniki czasu, -dzachowuję łącza (więc zamiast kopiowania zawartości pliku otrzymujesz dowiązania symboliczne), -Rrobię to rekurencyjnie i -xpozostaję w jednym systemie plików (bardzo przydatne, jeśli kopiujesz /lub coś z aktywnym punktem montowania ).

PS: -Rzamiast -rzwyczajnego używania ls -lR.

StarNamer
źródło
2
cp -axjest nieco krótszą wersją tego samego. Działa to świetnie - dziękuję!
EM0,
W rzeczywistości istnieje różnica między -ri -R. Sprawdź stronę podręcznika (nawet tę część, która jest za długa, aby ją tu zacytować).
geckon
2
Nie wydaje mi się, żeby tak było (chociaż kiedyś istniało i może być w niektórych wersjach Uniksa). Zobacz man7.org/linux/man-pages/man1/cp.1.html To po prostu mówi -R, -r, --recursive copy directories recursively.
StarNamer
14

cpma opcję zachowania własności pliku. Ze strony podręcznika 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
źródło
11

Możesz zrobić coś takiego:

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

tarzachowuje nienaruszone uprawnienia, własność i strukturę katalogów, ale przekształca wszystko w strumień bajtów. Uruchamiasz „podpowłokę” (polecenia w nawiasach), które zmieniają katalog, a następnie możesz tarcofnąć konwersję. Para bajtów staje się katalogami i plikami z prawidłową własnością i uprawnieniami.

Bruce Ediger
źródło
7

Odpowiedź jest prosta: cpma -popcję, która zachowuje uprawnienia (tutaj jest ryba).

Ale, jak mówi Wojtek w swoim komentarzu, man cp(przeczytanie dobrego podręcznika) byłby dobrym punktem wyjścia (chcesz nauczyć się łowić?).

buckdeer
źródło
1

możesz użyć preserve = all, wtedy twoja kopia zachowa wszystkie atrybuty, takie jak właściciel, grupa i sygnatura czasowa twoich plików. Dlatego wykonaj kopię zapasową bezpiecznie za pomocą następującego polecenia.

cp -r --preserve=all /home/my_home /media/backup/my_home
Majid Zarrin
źródło