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 /" बनाना चाहते हैं, लेकिन "नया / 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" \यह एक अतिरिक्त फाइल बनाता है लेकिन आप बाद में हटा सकते हैं।
फाबियानो सोरिएनी

1
यह नए rsync प्रोटोकॉल पर काम करता प्रतीत नहीं होता है, मुझे && या का उपयोग करते समय निम्नलिखित के समान त्रुटि मिलती है; in -sync- scp कमांड में अमान्य वर्ण! यहाँ: && / usr / bin / rsync
ghitesh

@ghitesh क्या आपने भागने की कोशिश की &&?
फेलिप अल्वारेज़

@FelipeAlvarez हाँ मैंने किया था, लेकिन काम नहीं किया। मैं अब लिंक नहीं ढूंढ पा रहा हूं, लेकिन कुछ प्रलेखन ने कहा कि यह तय है, क्योंकि मेरा मानना ​​है कि इसका (और) शोषण किया जा सकता था।
गीतेश

धन्यवाद, यह काम करता है। मेरे मामले में मैं एक दूरस्थ सर्वर पर एक स्थानीय बैश स्क्रिप्ट चला रहा था और उसके भीतर ssh mddir कमांड चला रहा था, जो निष्पादित कर रहा था, लेकिन फिर rsync कमांड चलाने से पहले बाकी स्क्रिप्ट को मार रहा था। यह बाकी स्क्रिप्ट को बिना मुद्दों के चलाने की अनुमति देता है।
जॉन्डविद 400

33

मान लें कि आप ss को rsync से कनेक्ट करने के लिए उपयोग कर रहे हैं, इससे पहले ssh कमांड भेजने के बारे में क्या:

ssh user@server mkdir -p existingdir/newdir

यदि यह पहले से मौजूद है, तो कुछ भी नहीं होता है


4
ufk का अनुरोध सिंटैक्स के लिए है जो "सर्वर पर [एक लापता लक्ष्य] निर्देशिका बनाने के लिए rsync [फ़ाइलों की प्रतिलिपि बनाने] का कारण होगा।" आपकी प्रतिक्रिया इस रूप में मान्य है कि यह सर्वर पर लापता लक्ष्य निर्देशिका बनाएगी ... लेकिन नहीं rsync, इसलिए, कोई जवाब नहीं।
टॉमरॉच

यह एक विकल्प नहीं है यदि sshसमर्थित नहीं है और दूरस्थ छोर पर rsyncजोड़ता है rsync daemon
Krzysztof Jabłoński

19

-R, --relativeविकल्प यह कर देगा।

उदाहरण के लिए: यदि आप बैकअप लेना चाहते हैं /var/named/chrootऔर रिमोट सर्वर पर समान निर्देशिका संरचना बनाते हैं, -Rतो बस यही करेंगे।


12
आप /./स्रोत पथ का उपयोग करके बनाए जाने वाले पथ के केवल भाग को निर्दिष्ट कर सकते हैं । विवरण के लिए मैन पेज देखें।
Marki555

21
उखाड़ना क्यों? उत्तर गलत है, rsyncयदि निर्देशिका फ़ोल्डर मौजूद नहीं हैं तो स्वचालित रूप से निर्देशिका नहीं बनाएंगे। आह।
ज़ीकवफू

3
मैं पाठकों को दृढ़ता से सुझाव देता हूं कि वे मैनपेज की जांच करें --relative। यह वह नहीं हो सकता जो आप सोचते हैं।
FiloSottile

3
--relative आपके सर्वर पर उपलब्ध कराए गए समापन बिंदु पर फ़ाइल के बजाय पूरा पथ चिपका देता है। आम तौर पर /tmp/foo/bar/file.c को दूरस्थ: / tmp रिमोट का उत्पादन करेगा: /tmp/file.c लेकिन -R के साथ यह /tmp/foo/bar/file.c बनाता है जब तक कि आप इस विकल्प का उपयोग न करें पता है कि आप क्या कर रहे हैं, आपको वास्तव में गन्दा निर्देशिका संरचना मिलेगी।
कॉर्मैक मुल्हल

7
@ Marki555 की टिप्पणी सफलता की कुंजी है। --relativeके साथ संयोजन के रूप /./में क्या सबसे newbies के लिए देख रहे हो जाएगा। rsync -avz -e ssh --progress --relative ~/./Desktop/ TARGET_IP:~/डेस्कटॉप की सामग्री को लक्ष्य डेस्कटॉप पर कॉपी करेगा। यह नहीं जानते कि उपयोगकर्ता नाम में अंतर इसको कैसे प्रभावित कर सकता है।
डैनियल एफ

15

यह मेरे लिए काम किया:

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

मुझे यह संदेश मिला:

skipping non-regular file "null"

लेकिन मैं एक खाली निर्देशिका के चारों ओर घूमने के बारे में चिंता करने की ज़रूरत नहीं है।


उत्तर kdubs के लिए धन्यवाद। वह महान काम किया। इसलिए, अगर मैं उन फ़ाइलों को रखना चाहता हूं जो मैं उस फ़ोल्डर के अंदर सिंक कर रहा हूं जिसे मैं स्रोत के रूप में इंगित कर रहा हूं, तो मुझे इसे निर्दिष्ट करने की आवश्यकता है, और यह बन जाता है। ex: rsync -avph / mytest / / otherfolder / mytest / फिर मुझे आउटपुट "निर्मित निर्देशिका / otherfolder / mytest" मिलता है
mbrinson

1
नए-डीआईआर के अंत में स्लैश ('/') को न भूलें, अन्यथा यह एक गैर-निर्देशिका फ़ाइल बनाएगा।
tartaruga_casco_mole 19

4

मुझे नहीं लगता कि आप इसे एक rsync कमांड के साथ कर सकते हैं, लेकिन आप अतिरिक्त निर्देशिका को पहले इस तरह 'प्री-क्रिएट' कर सकते हैं:

rsync --recursive emptydir/ destination/newdir

जहाँ 'एम्प्टीडिर' एक स्थानीय खाली निर्देशिका है (जिसे आपको पहले अस्थायी निर्देशिका के रूप में बनाना पड़ सकता है)।

यह थोड़ा हैक है, लेकिन यह मेरे लिए काम करता है।

चियर्स

क्रिस


अस्थायी फ़ोल्डर का उपयोग करने की आवश्यकता नहीं है। ऊपर rsync /dev/null node:existing-dir/new-dir/सुझाव देखें ।
ल्यूसिड_ड्रीमर

3

यह उत्तर अन्य उत्तरों के बिट्स का उपयोग करता है, लेकिन उम्मीद है कि यह परिस्थितियों के अनुसार थोड़ा स्पष्ट होगा। आपने कभी भी निर्दिष्ट नहीं किया कि आप क्या रेनसिंग कर रहे थे - एक एकल निर्देशिका प्रविष्टि या कई फाइलें।

तो चलिए मान लेते हैं कि आप एक डायरेक्टरी डायरेक्टरी एंट्री को पार कर रहे हैं, न कि इसमें मौजूद फाइल्स को ले जाने के लिए।

मान लीजिए कि आपके पास स्थानीय रूप से एक निर्देशिका है 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झंडे का मेरा उपयोग दोगुना वर्बोज़ आउटपुट प्राप्त करना है, इसलिए यह स्पष्ट है कि यह क्या करता है, साथ ही साथ आवश्यक पुनरावर्ती व्यवहार भी।

बस आपको दिखाने के लिए कि rsync का उपयोग करते समय मुझे क्या मिलेगा (3.0.9 उबंटू 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लेकिन इसे लक्ष्य पर बनाया / रिमोट / पथ / से / डेटा / myappdata / myappdata /
harleygolfguy

अगर मैं आपके पहले कमांड में थोड़ा बदलाव करता हूं और स्रोत पथ के बाद एक स्लैश '/' जोड़ देता हूं, तो यह काम करता है ... जैसे: rsync -rvv /path/to/data/myappdata/ user@host:/remote/path/to/data/myappdata
harleygolfguy

2

उदाहरण के लिए:

से: /xxx/a/b/c/d/e/1.html

को: उपयोगकर्ता @ रिमोट: /pre_existing/dir/b/c/d/e/1.html

rsync:

cd / xxx / a / && rsync -auvR b / c / d / e / उपयोगकर्ता @ रिमोट: / pre_existing / dir /

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.