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

8160

Я пытаюсь скопировать дерево каталогов с рекурсивным сохранением жестких ссылок в файл. Используя 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, но он не будет правильно создавать резервные копии зашифрованных каталогов.

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

5 ответов на вопрос

14
Paul Wagland

It is easy enough to install cp from MacPorts, however, if you don't want to, or want to create a portable script, then you have three options:

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 

pax

mkdir backups/todays_backup cd backups/yesterdays_backup pax -rwl . ../todays_backup 
6

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

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

0
Jonathan Leffler

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

0

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

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

+1 for Pauls's answer. ditto would be an option, but only if used in conjunction with find - it does preserve hard links, but only inside directories.

Похожие вопросы