rsync निर्देशिका काम नहीं कर रही है


34

मैं फेडोरा 17 64-बिट चला रहा हूं और rsync --exclude=/home/ben/<dir>उम्मीद के मुताबिक काम नहीं कर रहा है।

मैं rsyncअपने होम डाइरेक्टरी को थंब ड्राइव में लाने की कोशिश कर रहा हूं , लेकिन मैं निश्चित रूप से उन डायरेक्ट्रीज को बाहर करना चाहता हूं जो कैशे फाइल्स रखती हैं और फाइल्स का निर्माण करती हैं। यह वह कमांड है जिसका मैं उपयोग कर रहा हूं:

rsync --exclude=/home/ben/build/ --exclude=/home/ben/.ccache -arv /home/ben home-ben/

हालाँकि, ~/buildऔर से सामग्री की ~/.ccacheप्रतिलिपि बनाई जा रही है rsync। मैं क्या गलत कर रहा हूं?


1
मुझे लगता है कि सिर्फ काम नहीं करने वाले पैटर्न को बाहर करें।
सॉरेन

जवाबों:


37

rsyncएक अग्रणी के साथ शुरू होने वाले वैश्विक फिल्टर नियम हस्तांतरण की जड़ के लिए लंगर डाले हुए/ हैं । मैन पेज के "INCLUDE / EXCLUDE PATTERN RULES" खंड से उद्धरण:

यदि पैटर्न / के साथ शुरू होता है, तो यह फाइलों के पदानुक्रम में एक विशेष स्थान के लिए लंगर डाला हुआ है, अन्यथा यह मार्गनाम के अंत के खिलाफ मेल खाता है। यह नियमित अभिव्यक्तियों में एक अग्रणी ^ के समान है। इस प्रकार "/ foo" या तो "foo" का नाम "स्थानांतरण की जड़" (एक वैश्विक नियम के लिए) या मर्ज-फ़ाइल की निर्देशिका (प्रति-निर्देशिका नियम के लिए) से मेल खाएगा।

आपके आदेश ( rsync ... -arv /home/ben home-ben/) में, फ़ाइल /home/ben/fooको स्थानांतरित कर दिया जाएगा home-ben/ben/foo। स्थानांतरण की जड़ है home-benऔर सही फिल्टर पथ है /ben/foo। इस प्रकार,

  • मैच के लिए /home/ben/.ccacheआपको एक फ़िल्टर पथ की आवश्यकता है/ben/.ccache
  • मैच के लिए /home/ben/build/आपको एक फ़िल्टर पथ की आवश्यकता है/ben/build/

एक अधिक विस्तृत विवरण rsync(1)मैन पेज के "एन्करिंग इनक्लूड / एक्जाम पैटर्न" अनुभाग में पाया जा सकता है ।


ध्यान दें कि बस अग्रणी /को छोड़ना जरूरी नहीं है कि आप क्या चाहते हैं। उसी मैन पेज सेक्शन से फिर से कोटेशन:

एक अयोग्य "फू" पेड़ में कहीं भी "फू" के नाम से मेल खाता होगा क्योंकि एल्गोरिथ्म ऊपर से नीचे की ओर पुन: आवर्ती रूप से लगाया जाता है; यह व्यवहार करता है जैसे कि प्रत्येक पथ घटक फ़ाइल नाम के अंत में एक मोड़ प्राप्त करता है। यहां तक ​​कि असंबद्ध "उप / फू" पदानुक्रम में किसी भी बिंदु पर मेल खाता है, जहां "उप" नामक एक निर्देशिका के भीतर एक "फू" पाया गया था। स्थानांतरण की जड़ में मेल खाने वाले पैटर्न को कैसे निर्दिष्ट करें, इसकी पूरी चर्चा के लिए ANCHORING INCLUDE / EXCLUDE PATTERNS पर अनुभाग देखें।

इस प्रकार की एक फ़िल्टर पैटर्न build/में एक निर्माण निर्देशिका कहीं भी मेल खाएंगे /home/benभी, /home/ben/many/sub/directories/build/


2
मुख्य विवरण यह है कि स्लैश पदार्थ। यदि आप स्रोत निर्देशिका (rsync -a स्रोत / गंतव्य) के अंत में एक स्लैश जोड़ते हैं, तो यह स्रोत की सामग्री को कॉपी करेगा, अन्यथा rsync -a source destinationस्रोत निर्देशिका को गंतव्य पर ही कॉपी करता है। यह निर्धारित करता है कि बहिष्करण अभिव्यक्ति को सूचित करने के लिए स्थानांतरण की जड़ क्या होगी। इसके बाद / बाहर की अभिव्यक्ति का उचित उपयोग ऊपर बताया गया है। विशेष रूप से ध्यान दें कि rsync --exclude='/dir1' source destinationकुछ भी शामिल नहीं होगा।
पूजित

11

मुझे लगता है कि आपके excludeरास्तों को स्रोत पथ के सापेक्ष होने की आवश्यकता है। क्या आप इसके बजाय यह कोशिश कर सकते हैं?

rsync --exclude=build/ --exclude=.ccache -arv /home/ben home-ben/

यहाँ एक परीक्षण है, तुलना के लिए:

/tmp$ tree src dest
src
├── a
└── b
dest
└── foo/

/tmp$ rsync -nav --exclude /tmp/src/b /tmp/src /tmp/dest
sending incremental file list
src/
src/a
src/b

$ rsync -nav --exclude b /tmp/src /tmp/dest
sending incremental file list
src/
src/a

2
यह उत्तर गलत है। एक रिश्तेदार बहिष्कृत पथ के साथ आप हर जगह पैटर्न को बाहर कर देंगे!
rubo77

यह पोस्ट सही है। मिलान पाठ-आधारित है, फ़ाइल इनोड-आधारित नहीं है। --verboseकमांड शो के आउटपुट को जिस भी तरीके से इस्तेमाल करना है, वह है।
श्रीधर सरनोबत

इसने मेरे लिए काम किया।
झेनुयू

क्या होगा यदि स्रोत पथ '/' है तो निरपेक्ष सापेक्ष पथ हैं, लेकिन यह अभी भी काम नहीं करता है।
सॉरेन

यह केवल एक चीज है जो मेरे लिए काम करती है।
जोनाथन 9

2

मुझे एक स्क्रिप्ट में यह समस्या थी (मुझे नहीं पता कि यह आपका मामला है)। मैं इसलिए था क्योंकि मैंने एक स्क्रिप्ट में इस कमांड का उपयोग किया था और मैं बैश के बजाय श का उपयोग कर रहा था। अपनी स्क्रिप्ट की शुरुआत में शेबंग की जाँच करें।


1

आपका बहिष्कृत पैटर्न काम करेगा, यदि आप पूरे / घरेलू पथ को पीछे छोड़ते हैं अर्थात बिना किसी स्लैश के:

rsync --exclude=/home/ben/build/ --exclude=/home/ben/.ccache -arv /home home-all/

लेकिन बेहतर केवल एक अनुगामी स्लैश के साथ फ़ोल्डर की सामग्री rsync:

rsync --exclude=/build --exclude=/.ccache -arv /home/ben/ home-ben/

आप एक अनदेखा सूची का भी उपयोग कर सकते हैं, देखें: https://askubuntu.com/questions/545655/backup-your-home-directory-with-rsync-and-skip-useless-folders


0

Rsync के साथ एक निर्दिष्ट फ़ोल्डर को बाहर करने के लिए आपको कमांड में संबंधित पथ पर विचार करने की आवश्यकता है। आप के मामले में:

rsync --exclude=/ben/build/ --exclude=/ben/.ccache -arv /home/ben home-ben/

जहां "बेन" वह फ़ोल्डर है जिसे आप सिंक कर रहे हैं

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