Как мне скопировать папку, сохранив владельцев и разрешения без изменений?

378

Поэтому я собирался сделать резервную копию своей домашней папки, скопировав ее на внешний диск следующим образом:

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

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

Psachnodaimonia
источник
23
Да, было бы, я рад, что он спросил, потому что Google все еще быстрее, чем «человек» :-).
Stijn Geukens
3
Я рад, что он тоже спросил
Оле
5
@StijnGeukens Дело даже не в том, что Google быстрее, а в том, что даже manдля меня это загадочно. В этом случае, manв -rговорит same as --preserve=mode,ownership,timestamps. Откуда мне было знать, что значит сохранить первоначальные разрешения !?
Каньон Колоб
@KolobCanyon ты имеешь в виду-p
шторм

Ответы:

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

С man-страницы 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
Гвидо
источник
129
Намного лучше использовать cp -a. Это также включает -rфлаг ecursive, но он делает не только это - он сохраняет все в файле; Атрибуты SELinux, ссылки, xattr, все. Это «режим архива». Существуют лучшие инструменты для создания резервной копии, но если вы используете cpдля резервного копирования, не используйте ничего, кроме cp -a.
Подстановочный
25
Это работает, но терпение здесь хорошо. Команда только установит все правильно, когда она завершится: пока она все еще копирует каталог, а вы запускаете cp от имени пользователя root, каталог будет принадлежать пользователю root. Это только установит ему правильные разрешения, когда это закончится с этим каталогом.
Пол
4
cp -aне работает на некоторых системах: например, OS X, где (по крайней мере, в некоторых версиях) необходимо использовать cp -pR. На моей нынешней системе OS X (10.10.15), cp -aпохоже, это честь.
dubiousjim
Если я использую cp -a для копирования структуры папок, тогда diff <(getfacl -R folder1) <(getfacl -R folder2)я использую i sill, чтобы получить разные списки контроля доступа :(
philx_x
почему вы правы "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

Обратите внимание на завершающие косые черты (см. Man-страницу для деталей).

ученик
источник
4
+1, cp -pэто хорошо, но мне нравится rsync«s выхода намного больше в общем , что я совмещенный pcpс time rsync --progress -ah. В моем понимании это означает «прогресс копирование». И те, и другие принимают -r, поэтому он хорошо работает для общего использования терминала - но, к сожалению, не в сочетании с тем, sudoкак показано в этом вопросе / ответе.
Изката
15
NB:, 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 Под Mint, это работает отлично ... это только меняет владельца и группы позже (я не могу сказать, когда). Я только что скопировал всю свою /homeпапку, rsync -aX /home /mnt/sdd/и это сработало как шарм.
Оливье Понс
@JohnHamilton - это совсем не то, что сказал Персеидес.
user643011
60
cp -a

Где -aэто сокращение --archive- в основном он копирует каталог точно так, как он есть; файлы сохраняют все свои атрибуты, а символические ссылки не разыменовываются ( -d).

От man cp:

   -a, --archive
          same as -dR --preserve=all
Zaz
источник
21

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

PS: -Rа -rне просто привычка от использования ls -lR.

StarNamer
источник
2
cp -axнемного более короткая версия того же самого. Это сработало отлично - спасибо!
EM0
На самом деле есть разница между -rи -R. Проверьте страницу справочника (даже конкретную часть, слишком длинную, чтобы цитироваться здесь).
геккон
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.
Matteo
источник
11

Вы можете сделать что-то вроде этого:

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

tarСохраняет права доступа, владельца и структуру каталогов, но преобразует все в поток байтов. Вы запускаете «подоболочку» (команды в скобках), которые изменяют каталог, а затем получаете tarвозможность отменить преобразование. Пара байтов становится каталогами и файлами с правильными владельцами и разрешениями.

Брюс Эдигер
источник
7

Ответ прост: cpесть -pопция, которая сохраняет права доступа (вот рыба).

Но, как говорит Войтек в своем комментарии, man cp(чтение прекрасного руководства) будет хорошей отправной точкой (хотите научиться ловить рыбу?).

buckdeer
источник
1

Вы можете использовать preserve = all, тогда ваша копия сохранит все атрибуты, такие как владелец, группа и отметка времени ваших файлов. Итак, сделайте резервную копию безопасно с помощью следующей команды.

cp -r --preserve=all /home/my_home /media/backup/my_home
Маджид Заррин
источник