गंतव्य में मौजूदा फ़ाइलों की जगह के बिना एससीपी


158

गंतव्य निर्देशिका में सामग्री को प्रतिस्थापित किए बिना मैं उसी नाम की निर्देशिका में संपूर्ण निर्देशिका की प्रतिलिपि कैसे बना सकता हूं? (इसके बजाय, मैं गंतव्य फ़ोल्डर की सामग्री में जोड़ना चाहूंगा)


हाँ, यह है एक उपयोगी कार्यक्रम / उपयोगिता है कि एक नहीं है जब कष्टप्रद "यदि केवल यह हो सकता ..." विकल्प! इस मामले में "- nnoclobber"!
माइक डब्ल्यू

जवाबों:


139

उपयोग करें rsync, और पास करें -uयदि आप केवल उन फ़ाइलों को अपडेट करना चाहते हैं जो मूल निर्देशिका में नए हैं, या --ignore-existingगंतव्य में पहले से मौजूद सभी फ़ाइलों को छोड़ दें।

rsync -au /local/directory/ host:/remote/directory/
rsync -a --ignore-existing /local/directory/ host:/remote/directory/

( /स्रोत पक्ष पर ध्यान दें : इसके बिना यह rsyncबनाएगा /remote/directory/directory।)


@Anthon मुझे आपकी टिप्पणी समझ नहीं आ रही है और मुझे चंद्रा द्वारा कोई उत्तर या टिप्पणी नहीं दिख रही है। --ignore-existingजोड़ने के बिना जोड़ता है, क्या डेटा हानि देखते हैं?
गिल्स

क्षमा करें, मैंने केवल आपके पहले उदाहरण को देखा, जहां आपको डेटा हानि हो सकती है (और IMHO नहीं है जो ओपी ने पूछा है), यदि आप शामिल करते हैं --ignore- मौजूदा डेटा-लॉस नहीं होना चाहिए।
एंथन नोव

यह मदद नहीं करता है अगर रिमोट सिस्टम rsyncआसानी से उपलब्ध नहीं है .... (जैसे Win32-OpenSSH)
Gert van den Berg

@GertvandenBerg rsync विंडोज पर स्थापित करना बहुत आसान है, SSH से अधिक कठिन नहीं है।
गिल्स

@ गिल्स: यह सच है, लेकिन सभी विकल्पों में सिग्विन डीएलएल शामिल है ... (ओपनएसएसएच के एमएस पोर्ट की वर्तमान स्थिति ऐसी है कि एससीपी को तोड़ने के लिए एससीपी को तोड़ने के लिए संपीड़न सक्षम करना पर्याप्त है) ... (Win32 के लिए rsync कार्य करना) -ओपनएसएसएच गैर-तुच्छ भी लगता है - उम्मीद है कि समय के साथ सुधार होता है) (सोलारिस 10 अन्य उदाहरण है, जहां एक तृतीय पक्ष पैकेज और --rsync-pathआवश्यक है)
गर्ट वान डेन बर्ग

82

यदि आपके पास उन्हें लिखने की अनुमति है, तो scp फाइलों को अधिलेखित कर देगा।

दूसरे शब्दों में: आप scpअस्थायी रूप से उन पर लिखी अनुमतियों को हटाकर (यदि आप फ़ाइलों के स्वामी हैं, तो) को प्रभावी ढंग से स्किप कर सकते हैं ।


5
इसके लिए धन्यवाद। बिल्कुल वैसी ही चाल थी जिसकी मुझे तलाश थी।
saccharine

सुनिश्चित करें कि आप ऐसा करने के लिए * * जोड़ने वाली फ़ाइलों की प्रतिलिपि बनाएँ। उदाहरणscp -r user@server.com:/location/of/files/* /local/location/
रिक २

1
खोजो। -Type f -exec chown root: root {} \;
लिंग

1
असामान्य मामले में कि निर्देशिका में केवल कुछ फ़ाइलों को अधिलेखित किए जाने की उम्मीद है (यदि "संरक्षित नहीं"), और फ़ाइल अनुमतियाँ फ़ाइलों में समान नहीं हैं, तो यह समाधान काम नहीं कर सकता है। अन्यथा, यह काफी सरल और प्रभावी है।
sancho.s

खिड़कियों पर ऐसा करने के लिए सभी फाइलों का चयन करें, ठीक क्लिक करें -> गुण -> केवल पढ़ें
BenJammin

12

आप केवल नई फ़ाइलों को कॉपी कर सकते हैं। उपयोगfind

scp  `find /data/*.gz -type f -mtime +7` USER@SERVER:/backup/

+7 का क्या मतलब है?
फ्रांसिस किम

@FrancisKim का अर्थ है 7 दिन पहले संशोधित किया गया। तो यह क्वेरी किसी भी * .gz फाइलों को पिछले 7 दिनों के भीतर संशोधित कर चुनती है
वादिम ईरेमीव

4
क्या +7 वास्तव में 7 दिन से अधिक नहीं है?
जेफ एच।

1
हाँ इसका अर्थ है "7 दिन से अधिक पहले"। पता नहीं किसने इसे उखाड़ फेंका।
स्टीफन रीच

9

यदि आप गंतव्य फ़ाइल सामग्री को केवल पढ़ने के लिए बना सकते हैं:

find . -type f -exec chmod a-w '{}' \;

चलने से पहले scp(यह मौजूदा फ़ाइलों को शिकायत करेगा और छोड़ देगा)।

और उन्हें बाद में बदल दें ( chmod +wumask आधारित मूल्य प्राप्त करने के लिए)। यदि फ़ाइलों में आपके umask के अनुसार सभी अनुमति नहीं है, तो आपको किसी तरह अनुमतियों को संग्रहीत करना होगा ताकि आप उन्हें पुनर्स्थापित कर सकें।

(गिल्स का उत्तर मौजूदा फ़ाइलों को ओवरराइट कर देता है यदि स्थानीय रूप से वे नए हैं, तो मैंने इस तरह से मूल्यवान डेटा खो दिया है। समझ में नहीं आता कि क्यों गलत और हानिकारक उत्तर में बहुत सारे वोट हैं)।


2
मुझे यह नहीं मिला: rsync --ignore-existingआपने डेटा खोने का कारण कैसे बनाया ?
गिलीस

4
मुझे find: missing argument to '-exec'इस कमांड का उपयोग करने में त्रुटि हुई , और इसके बजाय उपयोग करना था find . -type f -exec chmod a-w {} \;:। मेरा linux बुरा है, ymmv।
wpearse

यह एक बेहतर और सुरक्षित जवाब है। अनुमति बदलने के लिए सही आदेश @wpearse के रूप में उल्लेख किया गया है:find . -type f -exec chmod a-w {} \;
आमिर

6

मैं एक ऐसी ही चुनौती थी, मेरे मामले में मैं का उपयोग नहीं कर सकता है rsync, csyncया फ्यूज क्योंकि मेरे भंडारण केवल SFTP है। rsyncफ़ाइल के लिए दिनांक और समय नहीं बदल सका, कुछ अन्य उपयोगिताओं (जैसे csync) ने मुझे अन्य त्रुटियां दिखाईं: " अस्थायी फ़ाइल बनाने में असमर्थ घड़ी का तिरछा पता चला "।

यदि आपके पास स्टोरेज-सर्वर तक पहुंच है - बस यहां एक डेमॉन के रूप में स्थापित openssh-serverया लॉन्च rsyncकरें।

मेरे मामले में - मैं ऐसा नहीं कर सका और समाधान था: lftplftpसिंक्रनाइज़ेशन के लिए उपयोग निम्न है:

lftp -c "open -u login,password sftp://sft.domain.tld/; \
    mirror -c --verbose=9 -e -R -L /srs/folder /rem/folder"

/src/folder- मेरे पीसी पर फ़ोल्डर है, /rem/folder- है sftp://sft.domain.tld/rem/folder

आप लिंक द्वारा मैन पेज पा सकते हैं: http://lftp.yar.ru/lftp-man.html


6

फ़ाइलों का एक पूरा गुच्छा कॉपी करने के लिए, उन्हें फाड़ना अधिक तेज़ है। -K का उपयोग करके आप टार को ओवरराइटिंग फ़ाइलों से भी रोकते हैं जब इसे लक्ष्य प्रणाली पर अनपैक किया जाता है।

tar -c <source-dir> | ssh <name>@<host> 'tar -kxzf - -C <target-dir>' 

1
यह रिमोट कनेक्शन बनाता है। पहले यह स्रोत को टार करता है, इसे ssh कनेक्शन में पाइप करता है और रिमोट सिस्टम पर अनपैक करता है।
हुबेई

-1

scpफ़ाइलों को अधिलेखित कर देता है और ऐसा करने से रोकने के लिए कोई स्विच नहीं है, लेकिन आप चीजों को बाहर की तरह कॉपी कर सकते हैं, scp कर सकते हैं और फिर मौजूदा फ़ाइलों को वापस कॉपी कर सकते हैं। उदाहरण:

  1. सभी मौजूदा फ़ाइलों को कॉपी करें

    mkdir original_files ; cp -r * original_files/
    
  2. Scp का उपयोग करके सब कुछ कॉपी करें

    scp -r user@server:dir/* ./
    
  3. किसी भी scp पर लिखी गई मूल फाइलों को कॉपी करें:

    cp -r original_files/* ./
    

3
यह विधि तब मदद नहीं करती है जब आप फ़ाइलों को रिमोट से खींचने की कोशिश करते हैं और जहाँ आप छोड़ते हैं, वहां से उठाते हैं। यानी अगर पूरा उद्देश्य समय बचाना है।
ओलिवर विलियम्स

-1

इसे प्राप्त करने का दूसरा तरीका lsगंतव्य फ़ोल्डर पर करना है:

दूरस्थ गंतव्य फ़ोल्डर पर:

ls | awk '{print "mv " $1 " ../copied_data/"}' > mv_copied_data
scp mv_copied_data user@source.server.com:/path/to/source/folder

स्रोत पर:

cd /path/to/source/folder
chmod 777 mv_copied_data
./mv_copied_data

गंतव्य पर:

scp -r user@source.server.com:/path/to/source/folder /path/to/destination/foldeer

कृपया ऐसा न करें। 1. एलएस पार्स मत करो । 2. उत्तर खतरनाक है यदि किसी फ़ाइल नाम में - >स्थान न्यूलाइन या अन्य विशेष वर्ण हैं। 3. एक अजगर स्क्रिप्ट में एक लूप के लिए हार्ड-कोड। बहुत सारे कारणों से रनटाइम पर प्रोग्राम बनाना कठिन और मुश्किल काम है (पेशेवर प्रोग्रामर द्वारा किया जाता है)। एक शेल स्क्रिप्ट उत्पन्न करना और भी बुरा है - एक भयानक विचार।
इग्निस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.