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.

mac  backup  rsync  cp 

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

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.


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).


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.


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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.