cp -r -l w MacOS (kopia rekurencyjna zachowująca twarde linki)

12

Próbuję skopiować drzewo katalogów rekurencyjnie zachowując dowiązania twarde do pliku. Przy użyciu gnu cp działałoby to z flagą -l. cp odtworzyłby wówczas strukturę katalogów, ale nie musiałby kopiować zawartości każdego pliku.

Jest to wstęp do kopii zapasowej, najpierw chcę zrobić tanią (na stałe) kopię poprzedniej kopii zapasowej, a następnie zsynchronizować katalog źródłowy z tą kopią. W przybliżeniu:

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

Niestety cp OSX nie obsługuje flagi -l, o ile mogę stwierdzić, cpio nie obsługuje kopiowania rekurencyjnego. Inną alternatywą jest pax, ale prowadzi to do skopiowania całej struktury katalogów:

 pax -rw backups/yesterdays_backup backups/todays_backup

przekształca:

 yesterdays_backup
 |
  \source_dir (...)

do:

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

Powinien istnieć łatwy / oczywisty sposób, aby to zrobić, ale obecnie jestem zaskoczony ... Jakieś alternatywy dla CPIO i PAX? Chciałbym uniknąć instalowania GNU CP.

Wiem o Timemachine, ale nie będzie to poprawne tworzenie kopii zapasowych zaszyfrowanych katalogów przyrostowo.


źródło
używając find wraz z cpio obejdź brak rekurencyjnego cpio, jak opisano tutaj: ( mikerubel.org/computers/rsync_snapshots/#Incremental ), ale nie wydaje się zbyt elegancki ...

Odpowiedzi:

16

Instalacja cp z MacPorts jest łatwa, jednak jeśli nie chcesz lub chcesz utworzyć przenośny skrypt, masz trzy opcje:

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

patena

mkdir backups/todays_backup
cd backups/yesterdays_backup
pax -rwl . ../todays_backup
Paul Wagland
źródło
Co jeśli źródło i miejsce docelowe znajdują się na różnych dyskach? Czy rsync nadal zachowuje twarde linki ze źródła w kopii wykonanej w miejscu docelowym?
lpacheco
7

Łatwo jest zainstalować coreutilspakiet z MacPorts, który zawiera cppolecenie GNU o zmienionej nazwie gcp.

Ale jeszcze lepsze, nowsze wersje rsync, w tym przynajmniej ta w OS X 10.5, obsługują opcję --link-dest, która powinna wyeliminować potrzebę początkowego cp -al. Zobacz tutaj . Dobrą praktyką jest również używanie opcji -E do kopiowania rozszerzonych atrybutów, list ACL itp.


źródło
1

Chociaż cpionie obsługuje bezpośredniego kopiowania rekurencyjnego, możesz podać dokładną listę plików, które chcesz skopiować, do standardowego wejścia i uzyskać efekt kopiowania rekurencyjnego za pomocą findpipingu cpio. Jest to bezpośrednio analogiczne do używania GNU tarz opcjami -T -(co oznacza odczytanie listy plików, których kopię zapasową należy wykonać ze standardowego wejścia).

Jonathan Leffler
źródło
1

Wierzę, że to, czego chcesz, można również osiągnąć ditto yesterdays_backup todays_backup. Domyślnie dittowykonuje kopię rekurencyjną, która zachowuje twarde łącza, listy ACL i rozszerzone atrybuty.


źródło
Problem polega na tym, że kopia nie jest już tania, gdy celem jest utworzenie twardych łączy w całym katalogu. to samo może je zachować, gdy istnieją, ale nie można powiedzieć, aby łączył zamiast tworzyć duplikat.
Florenz Kley,
Nie sądzę, żeby to samo kazało zachować twarde linki do katalogu. strona man mówi, że robi tylko twarde linki
Chris F Carroll
0

+1 za odpowiedź Paulsa. ditto byłoby opcją, ale tylko w połączeniu z find - zachowuje twarde linki, ale tylko wewnątrz katalogów.

Florenz Kley
źródło