जब निर्देशिका नाम में स्थान हो तो ssh पर rsync कैसे करें


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
यह मेरे लिए काम नहीं किया, लेकिन जॉनलेट द्वारा जवाब दिया।
Adriaan Tijsseling

यह स्पष्ट नहीं करता है कि दूरस्थ पक्ष के रिक्त स्थान से कैसे निपटा जाए।
ckujau

यह काम नहीं करता है, जैसा कि उल्लेख किया गया है।
छिपकली

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, --protect-args

यह विकल्प सभी फ़ाइलनाम और अधिकांश विकल्पों को दूरस्थ rsync को भेजता है, बिना दूरस्थ शेल को उनकी व्याख्या करने की अनुमति के। इसका मतलब है कि रिक्त स्थान नामों में विभाजित नहीं हैं, और किसी भी गैर-वाइल्डकार्ड विशेष वर्णों का अनुवाद नहीं किया जाता है (जैसे ~, $, $,; और, आदि)। वाइल्डकार्ड्स को दूरस्थ होस्ट पर rsync (इसके बजाय शेल करने वाले) द्वारा विस्तारित किया जाता है। [...]


13
यह मैक के लिए काम नहीं करता है।
मैट अलेक्जेंडर

8
मैक पर काम करता है अगर आप घर-काढ़ा का उपयोग करके rsync के हाल के संस्करण को स्थापित करते हैं।
Adriaan Tijsseling

4
देखें कि क्या यह आपके संस्करण के rsync में चल रहा है man rsyncऔर /s"--protect" के लिए खोज कर रहा है । होमब्रे के साथ स्थापित करने के लिए: brew install homebrew/dupes/rsyncयदि रन नहीं मिला brew search rsync
मिकीएलएल

12
नया संस्करण स्थापित अनावश्यक है, आप केवल रिक्त स्थान से बचते हैं और होस्ट / फ़ाइल नाम का उद्धरण करते हैं - उदाहरण के लिएrsync -Pavuz 'you@host:~/file\ with\ spaces' ./
ऑकोडो

यह स्वीकृत उत्तर होना चाहिए।
जोश एम।

38

यह काम करता है: बैकस्लैश के साथ रिक्त स्थान से बाहर निकलें और फिर उद्धरणों का उपयोग करें:

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

या यदि आपके पास चर $ Remote_path में पथ है, तो स्थानापन्न प्रतिस्थापन से बच सकते हैं:

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

1
मेरे लिए यही काम किया। मुझे मैक सर्वर पर काम करने से बचाया।
जॉर्ज

1
इसे सही उत्तर के रूप में चिह्नित किया जाना चाहिए। कुंजी यह है कि आपको बैकस्लैश और उद्धरण दोनों की आवश्यकता है।
श्रीधर सरनोबत

4
डबल-एस्केप एक दर्द है, -sविकल्प rsync के किसी भी आधुनिक संस्करण पर काम करता है और इस समस्या को हल करने के लिए डिज़ाइन किया गया है
मार्क के कोवन

नोट : यदि आप किसी दूरस्थ सर्वर से पथ में स्थान के साथ स्थानीय पथ पर अंतरिक्ष से प्रतिलिपि बना रहे हैं, तो आपको केवल दूरस्थ पथ के लिए उद्धरण जोड़ने की आवश्यकता है ।
लिनोहोह

@Teekarna से समाधान मेरे लिए काम किया। "Rsync" मैन पेज के अनुसार, वैकल्पिक "--protect-args" या "-s" का उपयोग करना है - वह भी मेरे लिए काम करता है।
किशन पारेख

14

दो जोड़े उद्धरणों का उपयोग करें

सभी बैकस्लैश से परेशान न हों, बस दोहरे उद्धरण चिह्नों के अंदर एकल उद्धरण का उपयोग करें :

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

आप रिवर्स का उपयोग भी कर सकते हैं, अर्थात सिंगल कोट्स के अंदर डबल कोट्स :

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

आगे की जानकारी

वाइल्डकार्ड सर्वर साइड पर

यदि आप चाहते हैं *कि क्लाइंट के बजाय सर्वर पर व्याख्या की जाए, तो *उद्धरणों के 2 जोड़े में से सिर्फ एक के अंदर आना चाहिए। मुझे यह काउंटर-सहज ज्ञान युक्त लगता है क्योंकि तार्किक रूप से उद्धरणों की बाहरी जोड़ी क्लाइंट व्याख्या से बच जाती है, जबकि उद्धरणों की आंतरिक जोड़ी सर्वर व्याख्या से बच जाती है।

आर्ग को सुरक्षित रखें

--protect-argsसमाधान की तुलना में लाभ यह है कि आपके पास वास्तव में प्रतिबंध नहीं है --protect-args, इसलिए आप विशेष वर्ण जैसे ~या का उपयोग कर सकते हैं$ । तो आप लिख सकते हैं:

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

या

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

ध्यान दें कि ~बाद के उदाहरण में टिल्ड ( ) को दोहरे उद्धरण चिह्नों के बाहर होना चाहिए ।

आप पूरे उपयोगकर्ता नाम @ होस्ट के आसपास के उद्धरणों में से एक जोड़ सकते हैं: फ़ाइल हिस्सा (जैसे ssh "me@myserver.com:'/home/me/test file'" .)


वास्तव में मेजबान भाग को उद्धरण में न रखने का आपका सुझाव अधिक व्यावहारिक है, इसलिए यह इस पोस्ट में पहली पंक्ति बनाने के लिए आकर्षक है।
श्रीधर सरनोबत

2
यह समाधान शानदार है! काम किया क्योंकि यह ssh पर rsync के साथ टिन पर था।
इकॉन

जब आप इसके बारे में सोचते हैं, तो उद्धरणों के 2 जोड़े पूरी तरह से तार्किक होते हैं: उद्धरणों की बाहरी जोड़ी इतनी होती है कि क्लाइंट इसे अविभाज्य रूप से व्यवहार करता है (जिनमें से सामग्री सर्वर वर्बेटिम को पास की जाती है) और उद्धरणों की आंतरिक जोड़ी सर्वर के लिए है अविभाज्यता को पहचानना।
श्रीधर सरनोबत

यह उत्तर रेखांकित है।
डेरेल

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

वास्तव में वास्तव में निर्देशिका पहले से मौजूद थी। आप मेरे असफल प्रयास में सही नहीं हैं, इससे निर्देशिका / ~ / नाम नहीं / ~ / नाम के साथ अंतरिक्ष मैंने हटा दिया / ~ / नाम रखा और विभिन्न विकल्पों की कोशिश करता रहा। अंतरिक्ष के साथ निर्देशिका / ~ / नाम पहले से मौजूद था मैं फ़ाइलों को जोड़ने की कोशिश कर रहा था इसके लिए
PyNEwbie

ओह, मैं समझता हूं कि तुम्हारा क्या मतलब है।
dg99

काम करता है यदि आप मेजबान / पथ के साथ-साथ रिक्त स्थान से बच जाते हैं।
ओसोडो

0

स्थिति पर निर्भर करते हुए, एक त्वरित विकल्प रिमोट सिस्टम पर एक सिमलिंक बनाना है:

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

मुझे सोच पसंद है, ऐसे समय होते हैं जब सहानुभूति बुरे नामकरण या अनावश्यक रूप से जटिल पदानुक्रमों की परेशानी को दरकिनार कर देती है।
श्रीधर सरनोबत


-1

इस तरह आजमाएं:

find /path/ -exec rsync -A -X -av -r -s root@xxxx:/path/ {} \;
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.