rsync केवल कुछ विशेष प्रकार की फ़ाइलों पर प्रतिलिपि का उपयोग करता है, जिसमें विकल्प भी शामिल है


110

मैं केवल कुछ एक्सटेंशन (इस मामले में .sh) की फ़ाइलों को कॉपी करने के लिए निम्नलिखित बैश स्क्रिप्ट का उपयोग करता हूं, हालांकि यह अभी भी सभी फाइलों पर कॉपी करता है। क्या गलत है?

= $ 1 से
= $ 2 से

rsync -zarv --include = "*। sh" $ से $

4
संबंधित कड़ाई से नहीं बोलते हुए, मैं $ से / $ तक के उद्धरण का सुझाव दूंगा। ऐसा न करने पर आपको अनपेक्षित परिणाम मिल सकते हैं यदि स्थिति संबंधी तर्क 1/2 में रिक्त स्थान शामिल हैं।
Kjetil Joergensen

क्या आपको समझ में आया कि आपकी कमांड सिर्फ काम क्यों नहीं करेगी?
चार्ली पार्कर

@CharlieParker: क्या आपको उपयोग करना है rsync, यह शेल इंटर्ल्स के साथ अच्छी तरह से प्राप्त किया जा सकता है?
इनियन

इस सवाल और इसके जवाबों की भी कमी है कि यदि मेरे पास पुनरावर्ती निर्देशिकाएँ हैं जिन्हें मैं केवल एक प्रकार की फ़ाइल भेजना चाहता हूँ तो कमांड को कैसे तैयार किया जाए। ऐसा लगता है कि यह केवल लक्ष्य निर्देशिका के लिए करता है ...
चार्ली पार्कर

जवाबों:


200

मुझे लगता --includeहै कि फ़ाइलों का एक सबसेट शामिल करने के लिए उपयोग किया जाता है जो अन्यथा --excludeकेवल उन फ़ाइलों को शामिल करने के बजाय बाहर रखा जाता है । दूसरे शब्दों में: आपको यह सोचना होगा कि क्या अर्थ शामिल नहीं है

इसके बजाय कोशिश करें:

rsync -zarv  --include "*/" --exclude="*" --include="*.sh" "$from" "$to"

Rsync संस्करण 3.0.6 या उच्चतर के लिए, आदेश को निम्नानुसार संशोधित करने की आवश्यकता है (टिप्पणियां देखें):

rsync -zarv --include="*/" --include="*.sh" --exclude="*" "$from" "$to"

-mध्वज जोड़ने से गंतव्य में खाली निर्देशिका संरचना बनाने से बचना होगा। संस्करण 3.1.2 में परीक्षण किया गया।

इसलिए यदि हम केवल * .sh फाइलें चाहते हैं तो हमें सभी फाइलों को बाहर करना होगा --exclude="*", सभी निर्देशिकाओं --include="*/"को शामिल करना होगा और सभी * .sh फाइलों को शामिल करना होगा --include="*.sh"

आप कुछ अच्छे उदाहरण मैन पेज के शामिल / बहिष्कृत पैटर्न नियमों को शामिल कर सकते हैं


10
हालांकि यह आपको सभी उप-निर्देशिकाएँ मिलेंगी, यदि आपके पास कोई भी .sh फाइलें हैं जिन्हें उपनिर्देशिकाओं में आप rsync करना चाहते हैं, तो संभावना है कि आप --include = "* /" का भी उपयोग करना चाहेंगे।
Kjetil Joergensen

50
मैंने इसे rsync संस्करण 3.0.7 पर आज़माया, जो मुझे बहुत पहले macports से मिला था, और इसमें शामिल / बहिष्कृत के इस आदेश के साथ काम नहीं किया था। यह वही है जो मैंने अपने लिए काम किया (ओपी के लिए अनुकूलित) rsync -zarv --include="*/" --include="*.sh" --exclude="*" "$from" "$to":।
बिजौ ट्रवेल्वेल

3
मैंने rsync 3.0.9 के साथ कोशिश की और यह काम नहीं किया। --include=\*.sh--exclude=\*
बिजौ

3
ध्यान दें कि आप हमेशा संपादन पर क्लिक कर सकते हैं और उत्तर को संपादित करने का सुझाव दे सकते हैं :)
अचल दवे

2
इसमें शामिल / निर्गमन के आपके आदेश के साथ काम नहीं किया जाता है, लेकिन यह बिजो ट्रॉवेलेल द्वारा सुझाए गए आदेश के साथ काम करता है
जॉन स्मिथ वैकल्पिक

57

@Chepner का उत्तर इस तथ्य के बावजूद सभी उप-निर्देशिकाओं को कॉपी करेगा कि उसमें फ़ाइल है या नहीं। यदि आपको उन उप-निर्देशिकाओं को बाहर करने की आवश्यकता है जो फ़ाइल में नहीं हैं और फिर भी निर्देशिका संरचना को बनाए रखें, तो उपयोग करें

rsync -zarv  --prune-empty-dirs --include "*/"  --include="*.sh" --exclude="*" "$from" "$to"

1
यह मेरे लिए एक आवश्यकता थी: "यदि आपको उप-निर्देशिका को बाहर करने की आवश्यकता है, जिसमें फ़ाइल शामिल नहीं है और अभी भी निर्देशिका संरचना को बनाए रखना है" +1
Juuso Ohtonen

1
मुझे समझ नहीं आ रहा है कि आपको कैसे पता चला कि - theincludes का आदेश क्या था?
चार्ली पार्कर

1
यदि मैं पुनरावर्ती निर्देशिकाओं को लिखता हूं, तो एक कमांड को कैसे तैयार किया जाता है, जिसे मैं केवल एक प्रकार की फाइल भेजना चाहता हूं। ऐसा लगता है कि यह केवल लक्ष्य निर्देशिका के लिए करता है।
चार्ली पार्कर

15

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

rsync -auzv --include './' --include '*.ext' --exclude '*' /source/dir/ /destination/dir/

पहले डॉट पर अपना ध्यान दें --include--no-rइस निर्माण में काम नहीं करता है।

संपादित करें:

बहुमूल्य टिप्पणी के लिए gbyte.co को धन्यवाद!


1
आपको कैसे पता चला कि झंडों का क्रम क्या होना चाहिए था और उन्हें शामिल करने के लिए क्या आवश्यक था?
चार्ली पार्कर

1
@CharlieParker, क्योंकि rsync आदेश में includeउन excludeविकल्पों और विकल्पों का उपयोग करता है, जिनमें वे निर्दिष्ट किए गए थे। इसके अलावा, यह पहले से मेल खाते हुए पर रुक जाता है। इसलिए, यदि हम --exclude '*'इस उदाहरण में पहले स्थान पर निर्दिष्ट करते हैं तो rsync कुछ नहीं करेगा। अधिक स्पष्टीकरण के लिए आदमी को देखें।
सर्ज रोसक

क्या आप मुझे समझा सकते हैं कि प्रत्येक ध्वज क्या कर रहा है? पहला ध्वज -- include './' कह रहा है कि स्रोत निर्देशिका पथ में सब कुछ शामिल है? फिर अगले एक `--include '.ext'` नाम के स्रोत पथ में विशिष्ट फ़ाइल शामिल है .extऔर फिर बाहर करने वाले का कहना है कि कुछ और नहीं है --exclude '*'? क्या वो सही है?
चार्ली पार्कर

1
यदि मैं पुनरावर्ती निर्देशिकाओं को लिखता हूं, तो एक कमांड को कैसे तैयार किया जाता है, जिसे मैं केवल एक प्रकार की फाइल भेजना चाहता हूं। ऐसा लगता है कि यह केवल लक्ष्य निर्देशिका के लिए करता है।
चार्ली पार्कर

1
इसके लिए धन्यवाद! जरूरत है --include '*.ext'और नहीं--include '.ext'
gbyte

13

यहाँ आदमी पृष्ठ से महत्वपूर्ण हिस्सा है:

जैसा कि स्थानांतरण करने के लिए फ़ाइलों / निर्देशिकाओं की सूची बनाई गई है, rsync प्रत्येक नाम को बदले में शामिल / बहिष्कृत पैटर्न की सूची के विरुद्ध स्थानांतरित करने के लिए जाँच करता है, और पहले मिलान पैटर्न पर कार्य किया जाता है: यदि यह एक बाहर का पैटर्न है, तो वह फ़ाइल है को छोड़ दिया; यदि यह एक सम्मिलित पैटर्न है तो फ़ाइल नाम छोड़ दिया नहीं जाता है; यदि कोई मिलान पैटर्न नहीं मिलता है, तो फ़ाइल नाम को छोड़ नहीं दिया जाता है।

संक्षेप में:

  • किसी भी पैटर्न से मेल न खाने का मतलब है कि एक फाइल कॉपी की जाएगी!
  • किसी भी पैटर्न से मेल खाने पर एल्गोरिथम क्विट हो जाता है

इसके अलावा, एक स्लैश के साथ समाप्त होने वाली कुछ निर्देशिकाओं (जैसे find -type dहोगा) से मेल खाती है ।

चलो ऊपर से इस उत्तर को अलग करें।

rsync -zarv  --prune-empty-dirs --include "*/"  --include="*.sh" --exclude="*" "$from" "$to"
  1. किसी भी निर्देशिका को न छोड़ें
  2. किसी भी .shफाइल को स्किप न करें
  3. सब कुछ छोड़ दो
  4. (स्पष्ट रूप से, कुछ भी न छोड़ें, लेकिन ऊपर का नियम डिफ़ॉल्ट नियम को कभी भी होने से रोकता है।)

अंत में, --prune-empty-directoriesसभी स्थानों पर खाली निर्देशिका बनाने से पहला नियम रखता है।


आपको समझाने के लिए बहुत बहुत धन्यवाद कि क्या हो रहा है। अब ज्यादा बेहतर मौका है कि मैं कमांड को नहीं भूलूंगा।
मोहम्मदीज १

3
'' एल्गोरिथ्म इस्तीफा एक बार किसी भी पैटर्न से मेल खाता है " - यह महत्वपूर्ण है, और उच्च रेटेड जवाब में से कोई भी रूप में स्पष्ट रूप से और सामने तुम यहाँ किया था के रूप में के रूप में यह समझाने बेशक यह। है आदमी पेज somehwere में, और अगर मैं 'पूरी बात ध्यान से पढ़िए, मैंने वही देखा है। फिर भी, धन्यवाद।
TheDudeAbides

0

अगर कोई इसे देखता है ... मैं केवल विशिष्ट फ़ाइलों और फ़ोल्डरों को rsync करना चाहता था और इसे इस कमांड के साथ करने में कामयाब रहा: rsync --include-from=rsync-files

Rsync-files के साथ:

my-dir/
my-file.txt

- /*

0

इस काम को लिखा और मेरी बैश स्क्रिप्ट में या डाल दिया ~/.bash_aliases। बैश और awkस्थापित के साथ लिनक्स पर स्थानीय रूप से सिंक किए गए परीक्षण । यह काम करता हैं

selrsync(){
# selective rsync to sync only certain filetypes;
# based on: https://stackoverflow.com/a/11111793/588867
# Example: selrsync 'tsv,csv' ./source ./target --dry-run
types="$1"; shift; #accepts comma separated list of types. Must be the first argument.
includes=$(echo $types| awk  -F',' \
    'BEGIN{OFS=" ";}
    {
    for (i = 1; i <= NF; i++ ) { if (length($i) > 0) $i="--include=*."$i; } print
    }')
restargs="$@"

echo Command: rsync -avz --prune-empty-dirs --include="*/" $includes --exclude="*" "$restargs"
eval rsync -avz --prune-empty-dirs --include="*/" "$includes" --exclude="*" $restargs
}

Avantages:

कम आसान और एक्स्टेंसिबल जब कोई अधिक तर्क जोड़ना चाहता है (यानी --dry-run)।

उदाहरण:

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