วิธีการคัดลอกโครงสร้างไดเรกทอรีโดยไม่ต้องลบ symlink


27

ฉันต้อง "ติดตั้ง" กลุ่มของไฟล์ไปยังไดเรกทอรีอื่นซึ่งทำให้โครงสร้างไดเรกทอรีของไฟล์ต้นฉบับไม่เปลี่ยนแปลง ตัวอย่างเช่นถ้าผมได้./foo/bar/baz.txtไปฉันต้องการผลที่ได้จะเป็น/var/www/localhost/webroot/ มีความสามารถนี้แต่เมื่อฉันทำสิ่งนี้ฉันค้นพบว่ามันไม่เป็นมิตรกับ symlinks:/var/www/localhost/webroot/foo/bar/baz.txtrsync--relative

$ ls -ald /var/www/localhost/webroot/ | grep ^l
lrwxrwxrwx  1 www-data www-data     15 2014-01-03 13:45 media -> ../static/media
lrwxrwxrwx  1 root     root         13 2014-02-24 13:47 var -> ../static/var
$ rsync -qrR . /var/www/localhost/webroot/
$ ls -ald /var/www/localhost/webroot/ | grep var
drwxr-xr-x 3 root root 4096 2014-02-24 13:52 /var/www/localhost/webroot/var

ดังนั้นคุณจะเห็นว่า symlink ไม่ใช่ symlink อีกต่อไป - ไฟล์ถูกคัดลอกไปยังที่ที่ไม่ถูกต้อง!

rsyncนอกจากนี้ยังมี--no-implied-dirsตัวเลือกที่ดูเหมือนเผินๆว่าจะทำในสิ่งที่ฉันต้องการ แต่มันก็ใช้งานได้ตามที่ฉันตั้งใจเมื่อไม่ได้ทำ rsync ซ้ำดังนั้นฉันจึงต้อง:

find . -type f -print0 | xargs -0I{} rsync -R --no-implied-dirs {} /var/www/localhost/webroot/

มีวิธีอื่นอีกหรือไม่ที่จะทำมิเรอร์ไฟล์ให้สำเร็จโดยไม่ต้องกำจัดไดเรกทอรี symlink ระดับกลาง (โดยมีหรือไม่มี rsync)

คำตอบ:


42

การใช้งานrsyncของตัวเลือก-K( --keep-dirlinks) จาก manpage:

 -K, --keep-dirlinks
      This  option  causes  the  receiving side  to  treat  a
      symlink  to  a  directory  as though  it  were  a  real
      directory, but only if it matches a real directory from
      the  sender.   Without   this  option,  the  receiver’s
      symlink  would  be deleted  and  replaced  with a  real
      directory.

      For example, suppose you  transfer a directory foo that
      contains a file file, but foo is a symlink to directory
      bar  on  the  receiver.  Without  --keep-dirlinks,  the
      receiver  deletes  symlink  foo,   recreates  it  as  a
      directory,  and   receives  the   file  into   the  new
      directory.   With --keep-dirlinks,  the receiver  keeps
      the symlink and file ends up in bar.

      One note  of caution:  if you  use --keep-dirlinks, you
      must  trust all  the symlinks  in the  copy!  If  it is
      possible  for an  untrusted  user to  create their  own
      symlink to  any directory,  the user  could then  (on a
      subsequent  copy)  replace  the  symlink  with  a  real
      directory and affect the  content of whatever directory
      the  symlink references.   For backup  copies, you  are
      better off using something like a bind mount instead of
      a symlink to modify your receiving hierarchy.

      See also  --copy-dirlinks for  an analogous  option for
      the sending side.

16

ฉันต้องการรักษา symlink ของฉันไว้เป็น symlink เพื่อให้คุณสามารถใช้ตัวเลือก -l

    -l, --links                 copy symlinks as symlinks

ตั้งแต่ฉันคัดลอกเฟรมเวิร์กบน OS X ฉันพบว่ามีประโยชน์


3

โปรดใช้-aเพราะมันหมายถึง-lตามที่คาดไว้ข้างต้น แต่มันก็มีตัวเลือกที่สำคัญอื่น ๆ หากคุณต้องการสำเนาที่สมบูรณ์

อีกทั้ง: ตามที่ฉันเข้าใจหน้า man นั้น-Kมีไว้สำหรับ symlink ที่ฝั่งผู้รับ ฉันไม่คิดว่านี่เป็นคำตอบที่ถูกต้องที่นี่


2

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

ตัวอย่างมากมายที่มีอยู่และฉันพบข้อเสนอแนะในคำตอบนี้ค่อนข้างรวดเร็ว: /unix//a/59108/34251

แก้ไข
เป็นครั้งที่สอง (รวบรัดมากขึ้น?) ตัวอย่างเช่น: /unix//a/19824/34251

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