คัดลอก symlink และตำแหน่งที่จะใช้ rsync


11

มันไม่จำเป็นต้องทำrsyncแต่มันก็ดีไม่ต้องเขียนสคริปต์เพื่อทำสิ่งนี้และrsyncอยู่ใกล้กับสิ่งที่ฉันต้องการ

rsync -a(หรือ-l) สามารถรักษา symlink และ-Lสามารถยกเลิกการเชื่อมโยง symere และคัดลอกราวกับว่ามันเป็นไฟล์ / dir ปกติ อย่างไรก็ตามมันเป็นไปได้ที่จะเก็บ symlink และคัดลอกไฟล์ / ไดเรกทอรีที่ลิงค์ชี้ไป

นี่คือตัวอย่าง สมมติว่าเรามีลำดับชั้นของโฟลเดอร์นี้:

dirA/link_to_file -> ../dirB/file
dirA/link_to_dir -> ../dirC
dirB/file
dirB/not_this_file
dirC/file
dirC/file2
dirD/others

และเมื่อฉันทำrsync -aR dirA dest(หรืออย่างอื่น) ฉันต้องการให้สิ่งเหล่านี้ปรากฏในdest:

dirA/link_to_file -> ../dirB/file
dirA/link_to_dir -> ../dirC
dirB/file
dirC/file
dirC/file2

เป็นไปได้ด้วยrsyncหรือไม่ ขอขอบคุณ.

สมมติว่า symlink มีพา ธ สัมบูรณ์หรือการชี้ไปนอกไดเรกทอรีต้นทางสามารถละเว้นได้


1
ผมคิดว่าคำขอของคุณ underspecified: คุณต้องการว่าถ้าdirA/linkเป็น symlink ไป../dirB/fileแล้วนี้ควรจะจัดการการคัดลอกdirB/fileไปdest/dirB/fileและจะdirA/link dest/dirA/linkเกิดอะไรขึ้นถ้าdirA/linkเป็นลิงค์ไป../../another_file? โดยทั่วไปแล้วจะเกิดอะไรขึ้นถ้าdirA/linkชี้ไปที่ไดเร็กทอรีที่สูงกว่าในทรีไดเรกทอรี
Riccardo Murri

จับดี. ในกรณีที่ฉันใช้ไม่มีการเชื่อมโยงชี้ไปที่นอกต้นไม้และไม่มีเส้นทางที่แน่นอนในการเชื่อมโยง
Wei-Yin

1
ยิ่งฉันคิดถึงมันมากเท่าไหร่ฉันก็ยิ่งคิดว่าจะไม่มีโปรแกรมอรรถประโยชน์มาตรฐานทำเช่นนี้ ในกรณีทั่วไปก็อาจจำเป็นต้องสร้างเป็นจำนวนมากในสถานที่ให้เป็นแหล่งเดียวถ้าคุณมี symlink ไป symlink หรือมากกว่าโดยทั่วไป symlink ที่มีเป้าหมายมีลิงก์สัญลักษณ์ (เป็นเช่นa -> b, b -> c/foo, c -> d/e: ขอให้สำเนาaนอกจากนี้ยังควรคัดลอกb, c, c/foo, d, d/eและd/e/foo)
Gilles 'หยุดชั่วร้าย'

@Gilles: ใช่คุณพูดถูก ลิงก์การติดตามอาจนำไปสู่การรวมไฟล์จำนวนมากได้ตราบใดที่ยังอยู่ในไดเรกทอรีต้นทาง
Wei-Yin

คำตอบ:


2

หากคุณรู้ชื่อ symlink และต้องการโอนลิงค์และเป้าหมายคุณสามารถ:

rsync -a 'symlink' .
realdir="$(basename "$(readlink -f 'symlink')")"
rsync -a "$realdir" .

ครั้งแรกที่ถ่ายโอนเพียงrsync symlinkคำสั่งที่สองค้นหาชื่อไดเรกทอรีจริงและที่สองrsyncถ่ายโอนเนื้อหาไดเรกทอรี


0

สิ่งนี้จะเป็นไปได้ถ้าหากคุณอยู่ใน 'mydir' และคุณต้อง rsync 'mydir' จากที่หนึ่งไปยังอีกที่หนึ่ง Rsync ไม่สามารถคัดลอกนอกเส้นทางที่คุณให้ (ยกเว้นลิงก์ต่อไปนี้) เช่น

mydir/dirA ...
mydir/dirB ...
...

ใช่สมมติฐานนี้เหมาะสมกับกรณีการใช้งานของฉัน ลิงก์ทั้งหมดอยู่ใน mydir
Wei-Yin

@ Wei-Yin เพียงแค่บอกว่าจะไม่ทำตาม symlink ... หรือฉันเข้าใจผิดบางสิ่งบางอย่าง
xenoterracide

@xenoterracide: ไม่ว่าคุณจะเรียกใช้ rsync ได้อย่างไรฉันคิดว่ามันจะสร้างปลายทางเดียวสำหรับแต่ละแหล่งข้อมูล (นอกเหนือจากการสร้างไดเรกทอรีชั้นนำ) แต่ Wei-Yin ต้องการสร้างจุดหมายสองแห่งขึ้นไปนั่นคือลิงก์และเป้าหมาย
Gilles 'หยุดความชั่วร้าย'

เห็นได้ชัดว่าฉันสับสน ...
xenoterracide

@Gilles: มีความจำเป็นในการที่จะปฏิบัติตาม rsync symlink ขณะที่มันจะซิงค์เป้าหมายไม่มีอยู่แล้ว ดังนั้นก่อนอื่นให้คัดลอก symlink โดยทำการห้อย symlink จากนั้นมันจะทำการคัดลอกทุกอย่างในไดเรกทอรีรวมถึงเป้าหมายของ symlink Voila ทุกอย่างลงตัวพอดีกัน
Martin v. Löwis
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.