Як скопіювати папку, що зберігає власників та дозволів неушкодженими?


377

Тому я збирався створити резервну копію домашньої папки, скопіювавши її на зовнішній диск таким чином:

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

У результаті чого всі папки на зовнішніх накопичувачах зараз належать root:root. Як я можу cpзберегти право власності та дозволи від оригіналу?


23
Так, було б, я радий, що він запитав, тому що Google все ще швидше, ніж "людина" :-).
Stijn Geukens

3
Я радий, що він також запитав
Оле

5
@StijnGeukens Навіть не те, що Google швидший, це навіть manдля мене кричуще. В цьому випадку, manв -rговорить same as --preserve=mode,ownership,timestamps. Як я повинен був знати, що це означає зберегти оригінальні дозволи !?
Калонь Колоб

@KolobCanyon ви маєте на увазі на-p
шторм

Відповіді:


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

З сайту 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

128
Набагато краще використовувати cp -a. Сюди також відноситься -rекварсивний прапор, але він більше того - він зберігає все про файл; Атрибути SELinux, посилання, xattr, все. Це "режим архіву". Існують кращі інструменти для створення резервної копії, але якщо ви використовуєте cpрезервну копію, не використовуйте нічого іншого, крім cp -a.
Wildcard

24
Це працює, але терпіння тут добре. Команда встановить все правильно лише тоді, коли вона закінчиться: Хоча вона все ще копіює каталог, а ви працюєте cp як root, каталог буде належати root. Він встановить правильні дозволи лише тоді, коли він закінчить цей каталог.
Поль

4
cp -aне працює в деяких системах: наприклад, OS X, де (хоча б у деяких версіях) потрібно використовувати один cp -pR. На моїй теперішній системі OS X (10.10.15), cp -aсхоже, честь.
сумнівний

Якщо я використовую cp -a, щоб скопіювати структуру папки, то, diff <(getfacl -R folder1) <(getfacl -R folder2)
можливо, за

чому ти правильний "cp -rp", а не "cp -p"?
Євген Кауров

94

Ви також можете використовувати rsync.

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

На сторінці сторінки rsync:

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

Дивіться це питання для порівняння cpта rsync: https://stackoverflow.com/q/6339287/406686

Зверніть увагу на кінці косої риси (деталі див. На сторінці сторінки).


4
+1, cp -pце добре, але мені подобається rsync«s виходу набагато більше в загальному , що я поєднаний pcpз time rsync --progress -ah. Підстава до "копії прогресу" в моїй свідомості. І обидва приймають -r, так що це добре працює для загального використання терміналу, але, на жаль, не в поєднанні з sudoпоказаними в цьому запитанні / відповіді.
Ізката

15
Примітка:, rsync -aне зберігає розширені атрибути ( -X) та відсутні ACL ( -A) - йдеться у короткому описі archive mode; equals -rlptgoD (no -H,-A,-X). Наприклад, контексти SELinux не будуть збережені без цього -X. Для багатьох випадків використання це добре, але якщо ви робите резервну копію системного розділу, відсутній -X може зламатися досить сильно. Наскільки мені відомо, cp -aнасправді зберігаються всі атрибути файлів.
Персеїди

2
Тільки тестувавши це, sudo cp -aзберігаючи власність та групи, sudo rsync -aзмінює їх у root. Отже, @Perseids правильно.
Джон Гамільтон

3
@JohnHamilton Під монетним двором це прекрасно працює ... він лише змінює право власності та групи згодом (я не можу сказати, коли). Я щойно скопіював всю свою /homeпапку, rsync -aX /home /mnt/sdd/і це спрацювало як шарм.
Олів'є Понс

@JohnHamilton - це зовсім не те, що говорив Персейдес.
user643011

60
cp -a

Де -aкоротко --archive- в основному він копіює каталог саме таким, який він є; файли зберігають усі свої атрибути, а посилання не переносяться ( -d).

Від man cp:

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

21

Я використовую, cp -pdRxякий буде -pзберігати режим, право власності та часові позначки, -dзберігати посилання (тому ви отримуєте символьні посилання замість того, що вміст файлу скопіюється), -Rробити це рекурсивно і -xзалишатися в одній файловій системі (корисно лише, якщо ви копіюєте /чи щось із активною точкою монтажу ).

PS: -Rзамість -rце просто звичка від використання ls -lR.


2
cp -axє трохи коротшою версією того ж самого. Це спрацювало чудово - дякую!
EM0

Насправді різниця між -rі -R. Перевірте сторінку чоловіка (навіть конкретна частина занадто довга, щоб цитувати тут).
geckon

2
Я не думаю, що існує (хоча, можливо, колись були і можуть бути в деяких версіях Unix). Дивіться man7.org/linux/man-pages/man1/cp.1.html Це просто сказано -R, -r, --recursive copy directories recursively.
StarNamer

14

cpє можливість збереження права власності на файл. З сторінки керівництва 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

Ви можете зробити щось подібне:

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

tarзберігає дозволи, власність та структуру каталогів недоторканими, але перетворює все у потік байтів. Ви запускаєте "доподібну оболонку" (круглі команди), що змінюють каталог, а потім дістаєте tarдо скасування перетворення. Пара байтів перетворюється на каталоги та файли з правильним правом власності та дозволами.


7

Відповідь проста: cpє -pопція, яка зберігає дозволи (ось риба).

Але, як каже Войтек у своєму коментарі, man cp(читаючи чудовий посібник) було б гарною відправною точкою (хочете навчитися ловити рибу?).


1

ви можете використовувати save = all, тоді ваша копія зберігатиме всі атрибути, такі як власник, група та часові позначки ваших файлів. Отже, зробіть резервну копію безпечно за допомогою наступної команди.

cp -r --preserve=all /home/my_home /media/backup/my_home
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.