วิธี rsync บน ssh เมื่อชื่อไดเรกทอรีมีช่องว่าง


71

ฉันพยายาม rsync จากเซิร์ฟเวอร์หนึ่งไปยังเซิร์ฟเวอร์อื่น เซิร์ฟเวอร์มีโครงสร้างไดเรกทอรีเดียวกัน แต่ฉันมีปัญหาในการรับเซิร์ฟเวอร์รีโมตเพื่อจดจำชื่อพา ธ บนรีโมตอย่างถูกต้องเมื่อมีที่ว่างในนั้น

นี่คือรายละเอียด

ไดเรกทอรีท้องถิ่นคือ

mnt/xlses/split/v2/name with space

ไดเรกทอรีระยะไกลคือ

mnt/xlses/split/v2/name with space

ฉันได้ลองทุกอย่างแล้วฉันสามารถค้นหาความพยายามครั้งล่าสุดได้

rsync --size-only -avzPe ssh  /mnt/xlses/split/v2/name\ with\ space/ root@myserver.com:/mnt/xlses/split/v2/"name with space"

เมื่อเรียกใช้สิ่งแรกที่รายงานคือมันกำลังสร้างไดเรกทอรีใหม่

ฉันขัดจังหวะและเห็นว่ามีไดเรกทอรีใหม่

mnt/xlses/split/v2/name

ไฟล์ทั้งหมดของฉันอยู่ในไดเรกทอรีนั้น

ฉันคาดหวังให้พวกเขามา

mnt/xlses/split/v2/name with space

คำตอบ:


8

ลอง

rsync --size-only -avzPe ssh /mnt/xlses/split/v2/name\ with\ space root@myserver.com:/mnt/xlses/split/v2/

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


9
สิ่งนี้ไม่ได้ผลสำหรับฉัน แต่คำตอบของ johnLate ก็ทำได้
Adriaan Tijsseling

สิ่งนี้ไม่ได้อธิบายวิธีจัดการกับช่องว่างในด้านระยะไกล
ckujau

สิ่งนี้ไม่ทำงานตามที่ระบุไว้
Lizardx

128

ลอง

rsync --protect-args --size-only -avzPe ssh  "/mnt/xlses/split/v2/name with space/ "root@myserver.com:/mnt/xlses/split/v2/name with space"

จากman rsync:

-s, - ป้องกัน args

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


13
สิ่งนี้ใช้ไม่ได้กับ Mac
แมตต์อเล็กซานเด

8
ใช้งานได้บน Mac หากคุณติดตั้ง rsync เวอร์ชันล่าสุดโดยใช้ home-brew
Adriaan Tijsseling

4
ดูว่ามันอยู่ใน rsync เวอร์ชันของคุณหรือไม่โดยเรียกใช้man rsyncและค้นหา ( /s) เพื่อหา "--protect" การติดตั้งกับ homebrew: หากไม่พบการทำงานbrew install homebrew/dupes/rsync brew search rsync
MikeiLL

12
การติดตั้งเวอร์ชั่นใหม่นั้นไม่จำเป็นคุณเพียง แต่ต้องเว้นช่องว่างและอ้างถึงชื่อโฮสต์ / ชื่อไฟล์ - เช่นrsync -Pavuz 'you@host:~/file\ with\ spaces' ./
ocodo

นี่ควรเป็นคำตอบที่ยอมรับได้
Josh M.

38

วิธีนี้ใช้ได้ใน bash: ยกเว้นช่องว่างด้วยแบ็กสแลชแล้วใช้เครื่องหมายคำพูด:

rsync -avuz me@some.server.com:"/media/Music/Heavy\ Metal/Witch\ Mountain/*" .

หรือถ้าคุณมีพา ธ ในตัวแปร $ remote_path ช่องว่างสามารถถูกหลีกเลี่ยงได้ด้วยการทดแทน:

rsync -avuz me@some.server.com:"${remote_path// /\\ }" .

1
ที่ทำงานให้ฉัน ช่วยให้ฉันไม่ต้องทำงานกับเซิร์ฟเวอร์ Mac
จอร์จ

1
ควรทำเครื่องหมายคำตอบที่ถูกต้อง กุญแจสำคัญคือคุณต้องมีทั้งแบ็กสแลชและเครื่องหมายคำพูด
Sridhar Sarnobat

4
การหลบหนีสองครั้งเป็นความเจ็บปวด-sตัวเลือกทำงานบน rsync รุ่นทันสมัยและออกแบบมาเพื่อแก้ปัญหานี้
Mark K Cowan

หมายเหตุ : ถ้าคุณกำลังคัดลอกจากเซิร์ฟเวอร์ระยะไกลที่มีพื้นที่อยู่ในเส้นทางไปยังเส้นทางในประเทศที่มีพื้นที่ที่คุณเพียงต้องเพิ่มคำพูดเพื่อเส้นทางระยะไกล
lenooh

โซลูชันจาก @teekarna ใช้งานได้สำหรับฉัน ตามหน้า man "rsync" ทางเลือกคือใช้ "--protect-args" หรือ "-s" - ซึ่งทำงานได้ดีสำหรับฉัน
Kishan Parekh

14

ใช้คำพูดสองคู่

อย่ากังวลกับแบ็กสแลชทั้งหมดเพียงใช้เครื่องหมายคำพูดเดี่ยวในเครื่องหมายคำพูดคู่ :

ssh me@myserver.com:"'/home/me/test file'" .

นอกจากนี้คุณยังสามารถใช้การย้อนกลับได้นั่นคือการพูดซ้ำสองครั้งภายในเครื่องหมายคำพูดเดี่ยว :

ssh me@myserver.com:'"/home/me/test file"' .

ข้อมูลเพิ่มเติม

สัญลักษณ์แทนทางฝั่งเซิร์ฟเวอร์

หากคุณต้องการ*ที่จะตีความบนเซิร์ฟเวอร์มากกว่าลูกค้า*จะต้องเข้ามาในราคาเพียงหนึ่งใน 2 คู่ของคำพูด ฉันพบว่าตัวนับนี้ใช้งานง่ายเพราะเหตุผลที่คู่นอกของอัญประกาศหนีการตีความของลูกค้าในขณะที่คู่ภายในของอัญประกาศหนีการตีความเซิร์ฟเวอร์

ปกป้อง Args

ข้อได้เปรียบเมื่อเทียบกับ--protect-argsวิธีการแก้ปัญหาคือการที่คุณจริงไม่ได้มีข้อ จำกัด ของ--protect-argsเพื่อให้คุณสามารถใช้ตัวอักษรพิเศษเช่น~$หรือ ดังนั้นคุณสามารถเขียน:

rsync host:'"$HOME/test file"' .

หรือ

rsync host:'~"/test file"' .

โปรดทราบว่าเครื่องหมายตัวหนอน ( ~) ในตัวอย่างหลังจำเป็นต้องอยู่นอกเครื่องหมายคำพูดคู่

คุณสามารถใส่หนึ่งในคู่ของคำพูดรอบชื่อผู้ใช้ทั้งหมด @ host: ส่วนของไฟล์ (เช่นssh "me@myserver.com:'/home/me/test file'" .)


จริงๆแล้วข้อเสนอแนะของคุณที่จะไม่ใส่ส่วนโฮสต์ไว้ในเครื่องหมายอัญประกาศนั้นเป็นเรื่องที่ลึกซึ้งยิ่งขึ้นดังนั้นจึงเป็นการดึงดูดให้สร้างบรรทัดแรกในโพสต์
Sridhar Sarnobat

2
วิธีนี้ยอดเยี่ยม! ทำงานเหมือนในกระป๋องด้วย rsync บน ssh
Ikon

เมื่อคุณคิดเกี่ยวกับมันราคาของคู่ที่ 2 เป็นตรรกะอย่างสมบูรณ์: คู่นอกของราคาคือเพื่อให้ลูกค้าปฏิบัติต่อมัน indivisibly (เนื้อหาที่ถูกส่งผ่านไปยังเซิร์ฟเวอร์คำต่อคำ) และคู่ภายในของราคาสำหรับเซิร์ฟเวอร์ เพื่อรับรู้การแบ่งแยก
Sridhar Sarnobat

คำตอบนี้ถูกประเมินค่าน้อยเกินไป
Derple

6

ฉันเข้าใจว่านี่เป็นคำถามเก่า แต่ฉันคิดว่าฉันจะเพิ่มเนื้อหาความรู้ที่มีอยู่

ฉันใช้rsyncกับหลายโฟลเดอร์ที่มีที่ว่างและใช้งานได้ ฉันมีโฟลเดอร์ที่มีหมายเลขตั้งแต่ 1-10 ดังนี้:

  • The\ Folder1
  • The\ Folder2
  • The\ Folder3
  • ..
  • The\ Folder10

อินสแตนซ์ 2 ที่คุณต้องการใช้rsyncคือโลคัลและรีโมต

  1. ท้องถิ่น - หมายเหตุการขาดคำพูด

    rsync -avu /media/data/The\ Folder* .
    
  2. ระยะไกล - หมายเหตุการมีอยู่ของคำพูด

    rsync -avu -e ssh you@domain.com:"/media/data/The\ Folder*" .
    

3

โดยทั่วไปให้อ้างอาร์กิวเมนต์และยกเว้นอักขระเว้นวรรคในอาร์กิวเมนต์ ในตัวอย่างที่คุณให้ลอง:

rsync --size-only -avzPe ssh  "/mnt/xlses/split/v2/name\ with\ space/" "root@myserver.com:/mnt/xlses/split/v2/name\ with\ space"

1

จากrsyncmanpages:

   If you need to transfer a filename  that  contains  whitespace,  you  can
   either  specify  the --protect-args (-s) option, or you'll need to escape
   the whitespace in a way that  the  remote  shell  will  understand.   For
   instance:

          rsync -av host:'file\ name\ with\ spaces' /dest

0

ฉันจะตอบคำถามนี้ด้วยตัวเองแม้ว่าคนอื่นจะอธิบายได้ดีกว่า

เห็นได้ชัดว่าการตั้งค่าบนเครื่องปลายทางมีผลต่อวิธีการแยกวิเคราะห์และเราต้องมีการตั้งค่าบางอย่างที่ทำให้ยากต่อการใช้เครื่องหมายคำพูดหรือเครื่องหมายทับเพื่อหนีช่องว่าง แต่เราสามารถใช้ไวลด์การ์ดได้

rsync --size-only -avzPe ssh  /mnt/xlses/split/v2/name\ with\ space/ root@myserver.com:/mnt/xlses/split/v2/name*

สิ่งนี้ใช้ได้กับฉันเพราะมีเพียงไดเรกทอรีเดียวที่เริ่มต้นด้วยชื่อหากฉันมีหลายไดเรกทอรีสิ่งนี้จะไม่ทำงาน

ท้ายที่สุดฉันต้องเข้าใจวิธีการตั้งค่าเซิร์ฟเวอร์ระยะไกลเพื่อให้สามารถแยกชื่อพา ธ ได้อย่างมีประสิทธิภาพมากขึ้น - ฉันไม่เคยใช้ช่องว่างในชื่อไดเรกทอรี แต่คนที่ตั้งค่านี้ทำและอย่างน้อยตอนนี้ฉันติดอยู่


ข้อเสนอของคุณใช้งานได้เพราะคุณได้สร้างไดเรกทอรีปลายทางในระหว่างการพยายามครั้งแรก (ไม่สำเร็จ) ดูคำตอบของฉันสำหรับวิธีที่ง่ายกว่า (ซึ่งมีข้อดีคือไม่ต้องพึ่งความพยายามครั้งแรกที่ล้มเหลว :)
dg99

จริง ๆ แล้วมีไดเรกทอรีอยู่แล้ว คุณไม่ถูกต้องในความพยายามที่ล้มเหลวของฉันมันสร้างไดเรกทอรี/ ~ / ชื่อไม่/ ~ / ชื่อด้วย Space I ลบ/ ~ / ชื่อและพยายามใช้ตัวเลือกต่าง ๆ ไดเรกทอรี/ ชื่อ / ที่มีช่องว่างอยู่แล้วฉันพยายามเพิ่มไฟล์ ไปได้
PyNEwbie

โอ้ฉันเห็นสิ่งที่คุณหมายถึง
dg99

ใช้งานได้ถ้าคุณอ้างถึงโฮสต์ / พา ธ รวมถึงยกเว้นช่องว่าง
ocodo

0

ตัวเลือกด่วนคือการสร้าง symlink บนระบบรีโมต: ขึ้นอยู่กับสถานการณ์

user@remote$ ln -s ~/name\ with\ space/ ~/name_with_space

จากนั้นใช้-Lแฟล็กrsyncที่บอกให้ติดตามเนื้อหาไดเร็กทอรี:

user@local$ rsync -avz -L user@remote:~/name_with_space/ ~/name\ with\ space

ฉันชอบความคิดมีบางครั้งที่ symlinking ข้ามความยุ่งยากของการตั้งชื่อไม่ดีหรือลำดับชั้นที่ซับซ้อนโดยไม่จำเป็น
Sridhar Sarnobat


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