cp -r -l в MacOS (рекурсивное копирование с сохранением жестких ссылок)

12

Я пытаюсь скопировать дерево каталогов с рекурсивным сохранением жестких ссылок в файл. Используя gnu cp, это будет работать с флагом -l. Затем cp воссоздает структуру каталогов, но не нужно копировать содержимое каждого файла.

Это предварительное резервное копирование, сначала я хочу сделать дешевую (жестко связанную) копию предыдущей резервной копии, а затем выполнить rsync исходного каталога над этой копией. Грубо говоря:

 cp -r -l yesterdays_backup todays_backup
 rsync -a source_dir todays_backup

К сожалению, cp OSX не поддерживает флаг -l, насколько я могу судить, cpio не поддерживает рекурсивное копирование. Другой альтернативой является pax, но это приводит к копированию всей структуры каталогов:

 pax -rw backups/yesterdays_backup backups/todays_backup

прообразы:

 yesterdays_backup
 |
  \source_dir (...)

чтобы:

 todays_backup
 |
  \backups
          \yesterdays_backup
                            \source_dir(...)

Должен быть простой / очевидный способ сделать это, но я в настоящее время в тупике ... Есть ли альтернативы cpio и pax? Я хотел бы избежать установки GNU CP.

Я знаю о Timemachine, но он не будет должным образом создавать резервные копии зашифрованных каталогов.


источник
использование find вместе с cpio позволяет обойти отсутствие рекурсивного cpio, как описано здесь: ( mikerubel.org/computers/rsync_snapshots/#Incremental ), но выглядит не очень элегантно ...

Ответы:

16

Установить cp из MacPorts достаточно просто, однако, если вы не хотите или хотите создать переносимый скрипт, у вас есть три варианта:

Rsync

rsync --archive --link-dest=../yesterdays_backup backups/yesterdays_backup\
   backups/todays_backup

CPIO

mkdir backups/todays_backup
cd backups/yesterdays_backup
find . -print | cpio -p -al ../todays_backup

чел

mkdir backups/todays_backup
cd backups/yesterdays_backup
pax -rwl . ../todays_backup
Пол Уогланд
источник
Что делать, если источник и место назначения находятся на разных дисках? Сохранит ли rsync жесткие ссылки из источника в копии, сделанной в месте назначения?
lpacheco
7

coreutilsПакет легко установить из MacPorts, который содержит команду GNU, cpпереименованную в gcp.

Но, что еще лучше, более новые версии rsync, включая, по крайней мере, версию в OS X 10.5, поддерживают опцию --link-dest, которая должна устранить необходимость в начальном cp -al. Смотрите здесь . Рекомендуется также использовать опцию -E для копирования расширенных атрибутов, списков ACL и т. Д.


источник
1

Хотя cpioрекурсивное копирование напрямую не поддерживается, вы можете подать точный список файлов, которые вы хотите скопировать, в свой стандартный ввод и добиться эффекта рекурсивного копирования с помощью findконвейера cpio. Это прямо аналогично использованию GNU tarс опциями -T -(что означает чтение списка файлов для резервного копирования из стандартного ввода).

Джонатан Леффлер
источник
1

Я верю, что то, что вы хотите, также может быть достигнуто с помощью ditto yesterdays_backup todays_backup. По умолчанию dittoвыполняется рекурсивное копирование с сохранением жестких ссылок, списков ACL и расширенных атрибутов.


источник
проблема в том, что копия больше не дешевая, когда цель состоит в том, чтобы создать жесткие ссылки в рамках каталога. То же самое может сохранить их, когда они существуют, но нельзя указывать ссылку вместо создания дубликата.
Флоренц Клей
Я не думаю, что то же самое можно сказать, чтобы сохранить жесткие ссылки каталога. Страница man говорит, что это только файл жестких ссылок
Крис Ф. Кэрролл
0

+1 за ответ Паулса. То же самое можно сделать, но только если оно используется вместе с find - оно сохраняет жесткие ссылки, но только внутри каталогов.

Флоренц Клей
источник