rsync: ฉันจะกำหนดค่าเพื่อสร้างไดเรกทอรีเป้าหมายบนเซิร์ฟเวอร์ได้อย่างไร


144

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

ฉันจะทำสิ่งนั้นได้อย่างไร

คำตอบ:


162

หากคุณมีมากกว่าไดเรกทอรีใบไม้สุดท้ายที่จะสร้างคุณสามารถเรียกใช้แยกต่างหากssh ... mkdir -pก่อนหรือใช้--rsync-pathเคล็ดลับตามที่อธิบายไว้ที่นี่ :

rsync -a --rsync-path="mkdir -p /tmp/x/y/z/ && rsync" $source user@remote:/tmp/x/y/z/

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

rsync -a --relative /new/x/y/z/ user@remote:/pre_existing/dir/

ด้วยวิธีนี้คุณจะท้ายด้วย / pre_existing / dir / new / x / y / z /

และหากคุณต้องการสร้าง "y / z /" แต่ไม่ได้อยู่ใน "new / x /" คุณสามารถเพิ่ม./ตำแหน่งที่คุณต้องการ--relativeเริ่ม:

rsync -a --relative /new/x/./y/z/ user@remote:/pre_existing/dir/

จะสร้าง / pre_existing / dir / y / z /


2
เซิร์ฟเวอร์ที่ฉันกำลังเข้าถึงไม่มีอยู่mkdirดังนั้นฉันใช้แฮก: --rsync-path="echo f > /public/.keep && rsync /public/.keep /public/newfolder/ && rsync" \มันสร้างไฟล์พิเศษ แต่คุณสามารถลบได้ในภายหลัง
Fabiano Soriani

1
ดูเหมือนว่านี่จะไม่ทำงานกับโปรโตคอล rsync ที่ใหม่กว่าฉันได้รับข้อผิดพลาดคล้ายกับต่อไปนี้เมื่อใช้ && หรือ; ใน --rsync- เส้นทางอักขระที่ไม่ถูกต้องในคำสั่ง scp! ที่นี่: && / usr / bin / rsync
ghitesh

@ghitesh คุณพยายามที่จะหลบหนี&&หรือไม่
Felipe Alvarez

@ FelipeAlvarez ใช่ฉันทำ แต่ไม่ทำงาน ฉันไม่สามารถหาลิงค์ได้ในตอนนี้ แต่เอกสารบางอย่างบอกว่านี่คือการแก้ไขเนื่องจากฉันเชื่อว่ามัน (และถูก) ถูกใช้ประโยชน์
ghitesh

ขอบคุณมันใช้งานได้ ในกรณีของฉันฉันกำลังเรียกใช้สคริปต์ทุบตีท้องถิ่นบนเซิร์ฟเวอร์ระยะไกลและภายในการเรียกใช้คำสั่ง ssh mkdir ซึ่งกำลังดำเนินการอยู่ แต่จากนั้นฆ่าสคริปต์ที่เหลือก่อนที่จะเรียกใช้คำสั่ง rsync นี่ทำให้สคริปต์ที่เหลือทำงานได้โดยไม่มีปัญหา
johndavid400

33

สมมติว่าคุณกำลังใช้ ssh เพื่อเชื่อมต่อ rsync สิ่งที่จะส่งคำสั่ง ssh ก่อน:

ssh user@server mkdir -p existingdir/newdir

ถ้ามันมีอยู่แล้วไม่มีอะไรเกิดขึ้น


4
คำขอของ ufk ใช้สำหรับไวยากรณ์ที่จะทำให้ "rsync สร้างไดเรกทอรี [เป้าหมายหายไป] บนเซิร์ฟเวอร์ [&& คัดลอกไฟล์]" การตอบกลับของคุณนั้นถูกต้องซึ่งจะสร้างไดเรกทอรีเป้าหมายที่ขาดหายไปบนเซิร์ฟเวอร์ ... แต่ไม่ใช่ด้วยrsyncดังนั้นจึงไม่มีคำตอบ
TomRoche

นี่ไม่ใช่ตัวเลือกถ้าsshไม่ได้รับการสนับสนุนและrsyncเชื่อมต่อกับrsync daemonบนรีโมทปลายทาง
Krzysztof Jabłoński

19

-R, --relativeตัวเลือกที่จะทำเช่นนี้

ตัวอย่างเช่น: หากคุณต้องการสำรองข้อมูล/var/named/chrootและสร้างโครงสร้างไดเรกทอรีเดียวกันบนเซิร์ฟเวอร์ระยะไกล-Rจะทำเช่นนั้น


12
คุณสามารถระบุได้เพียงบางส่วนของเส้นทางที่จะสร้างโดยใช้/./ในเส้นทางที่มา ดูหน้าคนสำหรับรายละเอียด
Marki555

21
ทำไมต้องโหวตขึ้น คำตอบนั้นผิดrsyncจะไม่สร้างไดเรกทอรีโดยอัตโนมัติหากไม่มีโฟลเดอร์เป้าหมาย ถอนหายใจ
zeekvfu

3
ผมขอแนะนำให้ผู้อ่านที่จะตรวจสอบ manpage --relativeสำหรับ มันอาจไม่ทำในสิ่งที่คุณคิด
FiloSottile

3
- สัมพันธ์ติดพา ธ แบบเต็มแทนที่จะเป็นไฟล์ที่จุดปลายที่คุณระบุไว้บนเซิร์ฟเวอร์ โดยปกติ /tmp/foo/bar/file.c เป็น remote: / tmp จะสร้าง remote: /tmp/file.c แต่ด้วย -R มันจะสร้าง /tmp/foo/bar/file.c อย่าใช้ตัวเลือกนี้เว้นแต่คุณจะ รู้ว่าสิ่งที่คุณทำคุณจะได้รับโครงสร้างไดเรกทอรียุ่งจริงๆ
Cormac Mulhall

7
@ ข้อคิดเห็นของ Marki555 คือกุญแจสู่ความสำเร็จ --relativeร่วมกับ/./เป็นสิ่งที่มือใหม่ส่วนใหญ่จะมองหา rsync -avz -e ssh --progress --relative ~/./Desktop/ TARGET_IP:~/จะคัดลอกเนื้อหาของเดสก์ท็อปไปยังเดสก์ท็อปเป้าหมาย ไม่ทราบว่าความแตกต่างของชื่อผู้ใช้อาจมีผลกับเรื่องนี้อย่างไร
Daniel F

15

สิ่งนี้ใช้ได้กับฉัน:

 rsync /dev/null node:existing-dir/new-dir/

ฉันได้รับข้อความนี้:

skipping non-regular file "null"

แต่ฉันไม่ต้องกังวลเกี่ยวกับการมีไดเรกทอรีว่างเปล่าห้อยอยู่


ขอบคุณสำหรับคำตอบ kdubs มันใช้งานได้ดีมาก ดังนั้นหากฉันต้องการให้ไฟล์ที่ฉันซิงค์อยู่ภายในโฟลเดอร์ที่ฉันชี้ไปยังแหล่งที่มาฉันก็ต้องระบุมันและมันจะถูกสร้างขึ้น เช่น: rsync -avph / mytest / / otherfolder / mytest / จากนั้นฉันจะได้รับผลลัพธ์ "สร้างไดเรกทอรี / otherfolder / mytest"
mbrinson

1
อย่าลืมเครื่องหมายทับ ('/') ในตอนท้ายของรหัสใหม่มิฉะนั้นจะสร้างไฟล์ที่ไม่ใช่ไดเรกทอรี
tartaruga_casco_mole

4

ฉันไม่คิดว่าคุณสามารถทำได้ด้วยคำสั่ง rsync เดียว แต่คุณสามารถ 'สร้างล่วงหน้า' ไดเรกทอรีพิเศษก่อนเช่นนี้:

rsync --recursive emptydir/ destination/newdir

โดยที่ 'emptydir' เป็นไดเรกทอรีว่างในเครื่อง (ซึ่งคุณอาจต้องสร้างเป็นไดเรกทอรีชั่วคราวก่อน)

มันเป็นบิตของการแฮ็ก แต่มันใช้ได้กับฉัน

ไชโย

คริส


ไม่จำเป็นต้องใช้โฟลเดอร์ชั่วคราว ดูrsync /dev/null node:existing-dir/new-dir/คำแนะนำด้านบน
lucid_dreamer

3

คำตอบนี้ใช้บิตของคำตอบอื่น ๆ แต่หวังว่ามันจะชัดเจนขึ้นเล็กน้อยตามสถานการณ์ คุณไม่เคยระบุสิ่งที่คุณกำลัง rsyncing - รายการไดเรกทอรีเดียวหรือหลายไฟล์

ดังนั้นสมมติว่าคุณกำลังย้ายรายการไดเรกทอรีต้นทางข้ามและไม่ใช่แค่ย้ายไฟล์ที่อยู่ในนั้น

สมมติว่าคุณมีไดเรกทอรีที่เรียกว่าภายในเครื่องdata/myappdata/และคุณมีไดเรกทอรีย่อยที่อยู่ภายใต้การโหลด คุณมีdata/เครื่องเป้าหมาย แต่ไม่data/myappdata/- มันง่ายพอ:

rsync -rvv /path/to/data/myappdata/ user@host:/remote/path/to/data/myappdata

คุณสามารถใช้ชื่ออื่นสำหรับไดเรกทอรีระยะไกล:

rsync -rvv --recursive /path/to/data/myappdata user@host:/remote/path/to/data/newdirname

หากคุณเพิ่งย้ายไฟล์บางไฟล์และไม่ย้ายรายการไดเรกทอรีที่มีไฟล์อยู่คุณจะต้อง:

rsync -rvv /path/to/data/myappdata/*.txt user@host:/remote/path/to/data/myappdata/

และมันจะสร้างmyappdataไดเรกทอรีสำหรับคุณบนเครื่องระยะไกลเพื่อวางไฟล์ของคุณอีกครั้งdata/ไดเรกทอรีจะต้องมีอยู่ในเครื่องระยะไกล

อนึ่งการใช้-rvvแฟล็กของฉันคือการรับเอาท์พุทแบบ verbose สองเท่าดังนั้นจึงชัดเจนเกี่ยวกับสิ่งที่มันทำรวมถึงพฤติกรรมการเรียกซ้ำที่จำเป็น

เพียงเพื่อแสดงให้คุณเห็นสิ่งที่ฉันได้รับเมื่อใช้ rsync (3.0.9 บน Ubuntu 12.04)

$ rsync -rvv *.txt user@remote.machine:/tmp/newdir/
opening connection using: ssh -l user remote.machine rsync --server -vvre.iLsf . /tmp/newdir/
user@remote.machine's password:
sending incremental file list
created directory /tmp/newdir
delta-transmission enabled
bar.txt
foo.txt
total: matches=0  hash_hits=0  false_alarms=0 data=0

หวังว่านี่จะเป็นการลบล้างสิ่งเล็กน้อย


นี้ไม่ได้ว่าทำงานคาดว่าเป็น ฉันลองคำสั่งแรกrsync -rvv /path/to/data/myappdata user@host:/remote/path/to/data/myappdataแต่สิ่งที่สร้างขึ้นบนเป้าหมายคือ / remote / path / to / data / myappdata / myappdata /
harleygolfguy

ถ้าฉันทำการเปลี่ยนแปลงเล็กน้อยกับคำสั่งแรกของคุณและเพิ่มเฉือน '/' หลังจากเส้นทางแหล่งที่มาแล้วก็ทำงาน ... ชอบโดย: rsync -rvv /path/to/data/myappdata/ user@host:/remote/path/to/data/myappdata
harleygolfguy

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