วิธี rsync หลาย ๆ โฟลเดอร์ต้นทาง


34

ฉันต้องการ rsync หลายแหล่งและฉันสงสัยว่าวิธีที่ดีที่สุดในการบรรลุเป้าหมายนั้น

เช่น

/etc/fstab
/home/user/download

ฉันคิดถึงวิธีแก้ปัญหา 3 ข้อ:

  • โซลูชันที่ 1

โทรหลายสายไปยัง rsync

rsync -a /etc/fstab bkp
rsync -a /home/user/download bkp

คอนดิชั่นยากขึ้นที่จะมีสถิติ

  • โซลูชันที่ 2

สร้างtobackupโฟลเดอร์ที่มี symlink และใช้-Lตัวเลือก

sync -aL /home/user/tobackup bkp

คอนดิชั่น: เนื้อหาที่จะสำรองข้อมูลจะต้องไม่มี symlink

  • โซลูชัน 3

ย้ายไฟล์ไปที่การสำรองข้อมูลและสร้าง symlink ในตำแหน่งเดิม

rsync -a /home/user/tobackup bkp

คอนดิชั่น: การตั้งค่าด้วยตนเองบางอย่าง

คุณแนะนำแบบไหน

มีวิธีที่ดีกว่า ?


คำตอบ:


33

คุณสามารถส่งผ่านอาร์กิวเมนต์แหล่งที่มาหลาย ๆ

rsync -a /etc/fstab /home/user/download bkp

สิ่งนี้จะสร้างbkp/fstabและbkp/downloadเช่นเดียวกับคำสั่งแยกต่างหากที่คุณให้ อาจเป็นที่ต้องการเพื่อรักษาโครงสร้างของแหล่งที่มาแทน เมื่อต้องการทำสิ่งนี้ให้ใช้/เป็นแหล่งที่มาและใช้กฎ include-แยกเพื่อระบุไฟล์ที่จะคัดลอก มีสองวิธีในการทำสิ่งนี้:

  • รวมแต่ละไฟล์อย่างชัดเจนรวมทั้งส่วนประกอบของไดเรกทอรีที่นำไปสู่ด้วย/***ที่ส่วนท้ายของไดเรกทอรีเมื่อคุณต้องการคัดลอกแผนผังไดเรกทอรีทั้งหมด:

    rsync -a \
        --include=/etc --include=/etc/fstab \
        --include=/home --include=/home/user --include='/home/user/download/***' \
        --exclude='*' / bkp
    
  • รวมไดเรกทอรีระดับบนสุดทั้งหมดด้วย/*/(เพื่อที่ rsync จะข้ามไป/etcและ/homeเมื่อค้นหาไฟล์ที่จะคัดลอก) และไดเรกทอรีระดับที่สองด้วย/*/*/(สำหรับ/home/user) แต่ให้ลบไดเรกทอรีที่ไม่มีไฟล์ที่จะคัดลอก สะดวกกว่าเพราะคุณไม่ต้องระบุผู้ปกครองอย่างชัดเจน คุณยังสามารถใช้--prune-empty-dirs --include='*/'แทนการนับจำนวนของระดับ แต่นี้จะทำไม่ได้ที่นี่เช่น rsync จะสำรวจระบบแฟ้มทั้งในการสำรวจไดเรกทอรีแม้ว่าไม่มีกฎระเบียบรวมถึงสามารถจับคู่นอกอะไรและ/etc/home/user/download

    rsync -a --prune-empty-dirs \
        --include='/*/' --include='/*/*/' \
        --include=/etc/fstab \
        --include='/home/user/download/***' \
        --exclude='*' / bkp
    

1
ยอดเยี่ยม แต่จะรักษาโครงสร้างไดเรกทอรีไว้ภายใน bkp ได้อย่างไร
Rodrigo

ฉันหมายถึง bkp / etc / fstab และ bkp / home / user / dowlonad? หรืออาจ / bkp / fstab และ bkp / download?
Rodrigo

@Rodrigo ฉันได้แก้ไขคำตอบแล้ว
Gilles 'SO- หยุดความชั่วร้าย'

13

ฉันชอบคำตอบของ Gilles จริง ๆ แต่ฉันต้องการเพิ่มว่าในมุมมองของฉันความต้องการในการซิงค์หลายโฟลเดอร์ในขณะที่รักษาโครงสร้างไดเรกทอรีได้ดีที่สุดโดยการส่งต่ออาร์กิวเมนต์แหล่งที่มาหลายตัวร่วมกับ--relativeตัวเลือก

ในกรณีนี้เราอาจมีบางสิ่งดังนี้:

rsync -aR /etc/fstab /home/user/download bkp

ซึ่งจะส่งผลในและbkp/etc/fstabbkp/home/user/download

ส่วนที่ดีที่สุดเกี่ยวกับเรื่องนี้คือ (ฉันเชื่อว่าตั้งแต่ rsync v. 2.6.7) เราสามารถควบคุมสาระสำคัญของโครงสร้างไดเรกทอรีที่เราต้องการจำลองที่ผู้รับ
(ดูเอกสารประกอบเกี่ยวกับ--relativeตัวเลือกที่นี่ )

เช่นถ้าเราทำสิ่งนี้

rsync -aR /home/./user1/download /home/./user2/download bkp

เราจะจบลงด้วยและbkp/user1/downloadbkp/user2/download


2

วิธีนี้ใช้งานได้เช่นวงเล็บปีกกาที่มีรายการแหล่งคั่นด้วยเครื่องหมายจุลภาค

rsync -vap --progress --stats root@server:{/etc,/root/backups,/home/ultralazer} /mnt/bigdrive

ค่อนข้างคล้ายกับสิ่งที่เกิดขึ้นเมื่อคุณเรียกใช้ sytnax วงเล็บปีกกาด้วย cp และยูทิลิตี้อื่น ๆ :

cp -vr /etc /root/backups /home/{ultralazer,zerocool} /mnt/bigdrive

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