cp -r -l в MacOS (рекурсивна копія із збереженням жорстких посилань)


12

Я намагаюся скопіювати дерево каталогів рекурсивно, зберігаючи жорсткі посилання на файл. Використовуючи gnu cp, це буде працювати з прапором -l. Потім cp відтворить структуру каталогу, але не потрібно копіювати вміст кожного файлу.

Це попереднє створення резервної копії, спочатку я хочу зробити дешеву копію попередньої резервної копії, а потім rsync вихідний каталог над цією копією. Приблизно:

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

На жаль, CPX 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, але це не буде належним чином створювати резервні копії зашифрованих каталогів поступово.

mac  backup  rsync  cp 

використовуючи пошук разом із 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

pax

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 та розширені атрибути.


Проблема полягає в тому, що копія вже не є дешевою, коли мета полягає в створенні жорстких посилань по всьому каталогу каталогу. ditto може зберегти їх, коли вони існують, але не можна сказати посилання замість створення дубліката.
Флоренц Клей

Я не думаю, що ditto навіть не можна сказати, щоб зберегти жорсткі посилання каталогів. man page повідомляє, що він містить лише жорсткі посилання
Chris F Carroll

0

+1 для відповіді Паулса. ditto був би варіантом, але лише якщо він використовується разом з find - він зберігає жорсткі посилання, але лише всередині каталогів.

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