คำสั่งของคุณไม่ทำงานเพราะเมื่อคุณใช้/var/www/*
เป็นแหล่งที่มาเชลล์ของคุณกำลังทำงานแบบกลมเช่นเชลล์กำลังขยาย*
ไปยังไฟล์ทั้งหมดในไดเรกทอรีนั้นและการคัดลอกไฟล์ทีละตัวดังนั้นที่นี่แต่ละไฟล์กลายเป็นแหล่งที่มาแทนที่จะเป็น ไดเรกทอรีหลัก
ดังนั้นหากคุณใช้งาน/var/www/*
คุณไม่จำเป็นต้องมี--recursive
ตัวเลือกที่*
จะทำให้ไฟล์ถูกคัดลอก (รวมถึงไดเรกทอรีที่มีเนื้อหา) ไม่ใช่ไดเรกทอรีหลักที่มีไฟล์ เนื่องจากเหตุผลเดียวกัน--delete
ไม่ทำงานเช่นเดียวกับที่--delete
จะลบไฟล์ออกจากไดเรกทอรีปลายทางที่ไม่ได้อยู่ในไดเรกทอรีต้นทางแต่คุณกำลังคัดลอกไฟล์เพื่อไม่ให้ลบไฟล์ (โดยคาดหมาย)
สิ่งนี้จะทำให้คุณชัดเจนยิ่งขึ้น:
/foo$ ls -l
-rw-rw-r-- 1 user user 0 Apr 16 17:56 egg
-rw-rw-r-- 1 user user 0 Apr 16 17:56 spam
drwxrwxr-x 2 user user 4096 Apr 16 18:14 test
/bar$ ls -l
-rw-rw-r-- 1 user user 0 Apr 16 17:56 egg
-rw-rw-r-- 1 user user 0 Apr 16 18:13 lion
-rw-rw-r-- 1 user user 0 Apr 16 17:56 spam
$ rsync -avz --ignore-existing --recursive --delete
/foo/* /bar/
+ rsync -avz --ignore-existing --recursive --delete
/foo/egg /foo/spam /foo/test /bar/
sending incremental file list
test/
test/hello
sent 173 bytes received 39 bytes 424.00 bytes/sec
total size is 0 speedup is 0.00
/bar$ ls -l
-rw-rw-r-- 1 user user 0 Apr 16 17:56 egg
-rw-rw-r-- 1 user user 0 Apr 16 18:13 lion
-rw-rw-r-- 1 user user 0 Apr 16 17:56 spam
drwxrwxr-x 2 user user 4096 Apr 16 18:14 test
อย่างที่คุณเห็นฉันใช้แหล่งที่มา/foo/*
ด้วยเหตุนี้rsync
คำสั่งที่ถูกดำเนินการก็คือ
rsync -avz --ignore-existing --recursive --delete /foo/egg
/foo/spam /foo/test /bar/
ด้วย*
การสร้างเชลล์เพื่อขยายและสร้างไฟล์ทั้งหมดแยกต่างหากเป็นซอร์สอาร์กิวเมนต์ไม่ใช่ไดเร็กทอรีพาเรนต์ทั้งหมด (และคุณไม่ต้องการ--recursive
ในกรณีนี้)
ดังนั้นหากคุณต้องการ--delete
ทำงานให้เรียกใช้เป็น:
rsync -avz --ignore-existing --recursive --delete
/var/www/ root@mydomaintest.com:/var/www/