cp -r -l di MacOS (salinan rekursif mempertahankan tautan keras)

12

Saya mencoba menyalin pohon direktori secara rekursif menjaga hardlink ke file. Menggunakan gnu cp, ini akan bekerja dengan flag -l. cp kemudian akan membuat ulang struktur direktori, tetapi tidak perlu menyalin isi dari setiap file.

Ini merupakan pendahuluan untuk cadangan, pertama saya ingin membuat salinan murah (hardlinked) dari cadangan sebelumnya dan kemudian rsync direktori sumber melalui salinan ini. Kurang lebih:

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

Sayangnya, cp OSX tidak mendukung flag -l, sejauh yang saya tahu, cpio tidak mendukung penyalinan rekursif. Alternatif lain adalah pax, tetapi itu mengarah ke seluruh struktur direktori yang disalin:

 pax -rw backups/yesterdays_backup backups/todays_backup

mengubah:

 yesterdays_backup
 |
  \source_dir (...)

untuk:

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

Seharusnya ada cara mudah / jelas untuk melakukan ini, tapi saya saat ini bingung ... Ada alternatif untuk cpio dan pax? Saya ingin menghindari menginstal gnu cp.

Saya mengetahui Timemachine, tetapi itu tidak akan mencadangkan direktori terenkripsi dengan baik secara bertahap.


sumber
menggunakan find bersama dengan cpio menyiasati kurangnya cpio rekursif seperti dijelaskan di sini: ( mikerubel.org/computers/rsync_snapshots/#Incremental ) tapi tidak tampak sangat elegan ...

Jawaban:

16

Cukup mudah untuk menginstal cp dari MacPorts, namun, jika Anda tidak mau, atau ingin membuat skrip portabel, maka Anda memiliki tiga opsi:

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
Paul Wagland
sumber
Bagaimana jika sumber dan tujuan berada di disk yang berbeda? Apakah rsync masih menyimpan tautan keras dari sumber dalam salinan yang dibuat di tempat tujuan?
lpacheco
7

Sangat mudah untuk menginstal coreutilspaket dari MacPorts yang berisi cpperintah GNU yang diubah namanya menjadi gcp.

Tetapi bahkan lebih baik, versi rsync yang lebih baru, termasuk yang ada di OS X 10.5 setidaknya, mendukung opsi --link-dest yang seharusnya menghilangkan kebutuhan akan cp -al awal. Lihat di sini . Ini praktik yang baik untuk menggunakan opsi -E, juga, untuk menyalin atribut yang diperluas, ACL, dll.


sumber
1

Meskipun cpiotidak mendukung penyalinan rekursif secara langsung, Anda dapat memberi makan daftar file yang ingin Anda salin ke input standarnya, dan mencapai efek salinan rekursif dengan menggunakan findpiped into cpio. Ini secara langsung analog dengan menggunakan GNU tardengan opsi-opsi -T -(yang berarti membaca daftar file yang dicadangkan dari input standar).

Jonathan Leffler
sumber
1

Saya percaya apa yang Anda inginkan juga dapat dicapai dengan ditto yesterdays_backup todays_backup. Secara default, dittoapakah salinan rekursif yang mempertahankan tautan keras, ACL, dan atribut yang diperluas.


sumber
masalahnya adalah bahwa salinan tidak murah lagi ketika tujuannya adalah untuk membuat tautan keras melintasi ruang lingkup direktori. DITTO dapat melestarikan mereka ketika mereka ada, tetapi tidak dapat diberitahu untuk menautkan daripada membuat duplikat.
Florenz Kley
Saya tidak berpikir bahkan bisa dikatakan untuk mempertahankan tautan keras direktori. halaman manual mengatakan itu hanya file tautan keras
Chris F Carroll
0

+1 untuk jawaban Pauls. DITTO akan menjadi pilihan, tetapi hanya jika digunakan bersama dengan find - ia mempertahankan tautan keras, tetapi hanya di dalam direktori.

Florenz Kley
sumber