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?


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

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


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

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.


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.

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.


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ć?).


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.