cp -r -l ใน MacOS (คัดลอกซ้ำเพื่อสงวนฮาร์ดลิงก์)


12

ฉันพยายามที่จะคัดลอกไดเรกทอรีต้นไม้ซ้ำรักษาฮาร์ดลิงก์ไปยังไฟล์ การใช้ gnu cp จะทำงานกับแฟล็ก -l cp จะสร้างโครงสร้างไดเรกทอรีขึ้นมาใหม่ แต่ไม่จำเป็นต้องคัดลอกเนื้อหาของแต่ละไฟล์

นี่เป็นข้อมูลเบื้องต้นสำหรับการสำรองข้อมูลขั้นแรกฉันต้องการทำสำเนาถูก (ฮาร์ดลิงก์) ของการสำรองข้อมูลก่อนหน้านี้จากนั้น rsync ไดเรกทอรีแหล่งที่มาบนสำเนานี้ ประมาณ:

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

น่าเสียดายที่ cp ของ OSX ไม่รองรับแฟล็ก -l เท่าที่ฉันจะบอกได้ cpio ไม่รองรับการคัดลอกซ้ำ ทางเลือกอื่นคือสันติภาพ แต่นำไปสู่โครงสร้างไดเรกทอรีทั้งหมดที่ถูกคัดลอก:

 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 recursive ตามที่อธิบายไว้ที่นี่: ( 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

สันติภาพ

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

ถ้าแหล่งที่มาและปลายทางอยู่ในดิสก์ที่ต่างกัน rsync จะยังคงรักษาลิงก์ถาวรจากแหล่งข้อมูลในสำเนาที่ทำในปลายทางหรือไม่
lpacheco

7

มันง่ายที่จะติดตั้งcoreutilsแพคเกจจากMacPortsซึ่งมี GNU คำสั่งเปลี่ยนชื่อเป็นcpgcp

แต่ดีกว่า rsync เวอร์ชันที่ใหม่กว่าซึ่งรวมถึงอย่างน้อยหนึ่งตัวใน OS X 10.5 อย่างน้อยรองรับตัวเลือก --link-dest ซึ่งไม่จำเป็นต้องใช้ cp -al เริ่มต้น ดูที่นี่ เป็นแนวปฏิบัติที่ดีที่จะใช้ตัวเลือก -E เช่นกันในการคัดลอกแอททริบิวต์แบบขยาย ACL ฯลฯ


1

แม้ว่าจะcpioไม่สนับสนุนการคัดลอก recursive โดยตรงคุณสามารถป้อนรายการที่แน่นอนของไฟล์ที่คุณต้องการคัดลอกลงเข้ามาตรฐานของตนและบรรลุผลของการสำเนา recursive โดยใช้ประปาเข้าfind cpioนี่คล้ายคลึงโดยตรงกับการใช้ GNU tarพร้อมตัวเลือก-T -(ซึ่งหมายถึงอ่านรายการไฟล์เพื่อสำรองจากอินพุตมาตรฐาน)


1

ditto yesterdays_backup todays_backupผมเชื่อว่าสิ่งที่คุณต้องการนอกจากนี้ยังสามารถประสบความสำเร็จกับ โดยค่าเริ่มต้นdittoจะทำซ้ำ recursive ที่เก็บฮาร์ดลิงก์ ACLs และคุณลักษณะเพิ่มเติม


ปัญหาคือการคัดลอกไม่ถูกอีกต่อไปเมื่อมีวัตถุประสงค์เพื่อสร้างการเชื่อมโยงอย่างหนักในขอบเขตไดเรกทอรี เหมือนกันสามารถรักษาพวกเขาเมื่อพวกเขามีอยู่ แต่มันไม่สามารถบอกได้ว่าจะเชื่อมโยงแทนที่จะสร้างที่ซ้ำกัน
Florenz Kley

ฉันไม่คิดว่าเหมือนกันสามารถบอกให้รักษาลิงก์ถาวรไดเรกทอรี หน้าคนบอกว่าจะทำลิงค์ฮาร์ดลิงก์เท่านั้น
Chris F Carroll

0

+1 สำหรับคำตอบของ Pauls เหมือนกันจะเป็นตัวเลือก แต่ถ้าใช้ร่วมกับการค้นหา - มันจะรักษาลิงก์ถาวร แต่เฉพาะในไดเรกทอรี

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.