วิธีการซิงค์ไดเรกทอรีไปยังไดเรกทอรีใหม่ที่มีชื่อแตกต่างกันอย่างไร


48

ฉันกำลังทำการถ่ายโอนข้อมูลระบบไฟล์เก่าอาศัยอยู่ในไดเรกทอรีที่ลึกซึ้งซึ่งขณะนี้อยู่ในเส้นทางที่แตกต่างกัน นี่คือไดเรกทอรี git ที่เก็บรหัสออนไลน์ ฉันไม่มีสิทธิ์ในการย้ายหรือเปลี่ยนชื่อ

ดังนั้นสิ่งที่ฉันสามารถทำได้คือ rsync ไดเรกทอรีนี้ไปยังเส้นทางเดิม แต่ชื่อไดเรกทอรีก็เปลี่ยนไป

มีวิธีง่ายๆที่ฉันสามารถซิงค์ไดเรกทอรีไปยังไดเรกทอรีเป้าหมายด้วยชื่ออื่นได้หรือไม่?

คำตอบ:


82

หากคุณต้องการใช้rsyncเพื่อทำให้destไดเรกทอรีซ้ำเป็นสำเนาที่แน่นอนของsrcไดเรกทอรี:

rsync -a src/ dest

rsyncหน้าคนอธิบายวิธีการทำงานนี้:

เครื่องหมายทับต่อท้ายบนแหล่งที่มา [... ] หลีกเลี่ยง [s] สร้างระดับไดเรกทอรีเพิ่มเติมที่ปลายทาง คุณสามารถคิดถึงการลาก/บนแหล่งที่มาเป็นความหมาย "คัดลอกเนื้อหาของไดเรกทอรีนี้" ซึ่งตรงข้ามกับ "คัดลอกไดเรกทอรีตามชื่อ" [... ]


3
สิ่งนี้จะสร้างsrcไดเรกทอรีภายใต้destไดเรกทอรี
Zen

7
@ เซนไม่rsyncเคยใช้รุ่นใดเลย หากนั่นเกิดขึ้นกับคุณจริง ๆ แล้วคุณไม่มีเครื่องหมายทับท้ายท้ายอาร์กิวเมนต์แหล่งที่มา
เอเดรีย

3
ที่เฉือนส่อเสียดต่อท้ายเป็นกุญแจสำคัญ ...
tutuca

โชคร้ายนี้ดูเหมือนจะไม่ทำงานถ้าdestเป็น symlnk ไปsrcก็จบลงแทนการคัดลอกไปsrc src/srcทดสอบบน macOS หวังว่าฉันจะแทนที่bar -> foo/ด้วยbar/แต่ต้องใช้ไดเรกทอรีชั่วคราวกลาง
user5359531

@ user5359531 หากคุณทราบว่าdestเป็น symlink ไปsrcเพียงแค่rm destก่อนที่จะใช้คำสั่งดังกล่าว rsyncก็เพียงพอที่จะสร้างสมาร์ทก่อนที่จะคัดลอกเนื้อหาของdest srcคุณไม่จำเป็นต้องมีตัวกลางชั่วคราว
Adrian

1

หากทั้งระบบไฟล์เก่าและใหม่สามารถเข้าถึงเครื่องของคุณได้ให้ลองใช้ลิงก์สัญลักษณ์แทน rsync หากคำสั่ง rsync ที่คุณใช้ไม่ได้ระบุโฮสต์ (หรือหากพวกเขาเป็นโฮสต์เดียวกัน) แสดงว่าเป็นกรณีนี้ คุณกำลังพยายามทำมิเรอร์สองไดเรกทอรีด้วยชื่อที่ต่างกันในโฮสต์เดียวกัน อย่าใช้ rsync สำหรับสิ่งนี้เนื่องจากคุณกำลังทำซ้ำข้อมูลและคุณจะต้องเรียกใช้ rsync ของคุณเพื่อให้ข้อมูลตรงกัน

การใช้ลิงก์สัญลักษณ์เป็นการแก้ไขครั้งเดียวที่จะทำมิเรอร์สองไดเรกทอรี (ที่มีชื่อแตกต่างกัน) และต้องใช้พื้นที่เกือบไม่มี มันเหมือนกับการสร้างไดเรกทอรีนามแฝงที่ชี้ไปยังไดเรกทอรีอื่น

สมมติว่าคุณมีคอมไพล์เก่าในไดเรกทอรีชื่อ / old / path / old_git และตอนนี้ที่เก็บรหัสได้ย้ายไปที่ / new / path / new_git

คุณทำได้:

cd /old/path
rm -rf old_git     (if you still have it there, get rid of it, or move it out of the way)  
ln -s /new/path/new_git old_git

สิ่งนี้จะสร้างลิงค์ดังนี้:

/ old / path / old_git -> / new / path / new_git

ดังนั้นสิ่งใดก็ตามที่ใส่เข้าไปใน new_git จะสามารถใช้งานได้ในแบบเก่าเช่นกันโดยไม่ต้องทำซ้ำข้อมูลและไม่ต้องซิงค์ข้อมูลเหล่านั้นอย่างต่อเนื่อง


1
ระวังด้วยคำสั่ง rm -rf old_git นี่จะเป็นการลบที่เก็บ old_git ทั้งหมดของคุณ ถ้าฉันไม่เข้าใจปัญหาของคุณถูกต้องนี่อาจเป็นสิ่งที่ไม่ดี
jrel

0

ฉันหาทางเลือกอื่นแล้ว

การใช้rysnc -r /origin/* /target/สามารถซิงค์เนื้อหาทั้งหมดจากไดเรกทอรีต้นทางไปยังไดเรกทอรีเป้าหมาย


8
ฉันเชื่อว่านี่จะไม่รวมไฟล์ dot (.foo) เพราะสิ่งเหล่านี้จะไม่ถูกจับคู่กับเครื่องหมายดอกจัน
Ray Burgemeestre

ที่อาศัยการขยายตัวของเชลล์ glob เทคนิคจะผ่านทุกไฟล์ที่พบว่ามีการโต้แย้ง rsync rsync -r $(find /origin -maxdepth 1 -type f) /target/ มันเกือบจะเป็นเช่นเดียวกับการทำงาน @RayBurgemeestre ชี้ให้เห็นการขยายตัวของเชลล์ glob จะไม่รวมไฟล์ dot
Florian Castellane
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.