rsync: उन फ़ाइलों को छोड़ें जिनके लिए मेरे पास अनुमतियां नहीं हैं


16

मैं rsync -rlptDकिसी अन्य उपयोगकर्ता की निर्देशिका को कॉपी करने के लिए उपयोग कर रहा हूं । कुछ फाइलें हैं (मेरे पास इनको पहले से जानने का कोई तरीका नहीं है) जिन्हें मुझे कॉपी करने की अनुमति नहीं है। वहाँ एक तरीका है rsync इन पर ध्यान न दें। मुसीबत यह है कि अगर rsync नॉन-शून्य लौटा तो मेरी बैश -x स्क्रिप्ट बाहर निकल जाएगी।


Rsync ने निकास मानों को अच्छी तरह से प्रलेखित किया है। यदि आप अपनी स्थिति को असफल नहीं कहते हैं तो आपको उन सभी को असफलता नहीं माननी चाहिए।
जोर्डन

@jordanm लेकिन कोई त्रुटि कोड नहीं है जो केवल इस त्रुटि को इंगित करने के लिए पर्याप्त विशिष्ट है।
गिलेस एसओ- बुराई को रोकना '

जवाबों:


7

Rsync के पास इसके लिए कोई विकल्प नहीं है। मैं दो समाधान देखता हूं। एक rsync त्रुटि संदेशों को पार्स करना है; यह बहुत मजबूत नहीं है। अन्य फ़िल्टर करने के लिए अपठनीय फ़ाइलों की सूची तैयार करना है।

cd /source/directory
exclude_file=$(mktemp)
find . ! -readable -o -type d ! -executable |
  sed -e 's:^\./:/:' -e 's:[?*\\[]:\\1:g' >>"$exclude_file"
rsync -rlptD --exclude-from="$exclude_file" . /target/directory
rm "$exclude_file"

यदि आपके findपास नहीं है -readableऔर -executable, उन्हें उपयुक्त -permनिर्देश द्वारा प्रतिस्थापित करें ।

यह मानता है कि ऐसी कोई अपठनीय फ़ाइलें नहीं हैं जिनके नाम में एक नई पंक्ति है। यदि आपको उन लोगों के साथ सामना करने की आवश्यकता है, तो आपको इस तरह से एक शून्य-सीमांकित फ़ाइल सूची का उत्पादन करने की आवश्यकता होगी, और इसके लिए -0विकल्प पास करें rsync:

find . \( ! -readable -o -type d ! -executable \) -print0 |
  perl -0000 -pe 's:\A\./:/:' -e 's:[?*\\[]:$1:g' >>"$exclude_file"

यह शायद उनका सबसे अच्छा दांव है। उम्मीद है, उसे केवल एक बार इसे चलाने की जरूरत है, क्योंकि stat()हर फाइल के लिए दो बार (एक बार rsync के माध्यम से और एक बार खोजने के माध्यम से) बहुत बुरा होगा।
जोर्डन

@ यह काम करने के लिए लगता है, छिपी हुई फ़ाइलों को छोड़कर। मैं मान रहा हूं कि वही रणनीति कुछ मामूली ट्विकिंग के साथ काम करेगी। बेनाम: मैं \ के साथ परिचित नहीं हूँ! (स्लैश विस्मयबोधक) क्या आप यह समझा सकते हैं?
जेफ़चैटर

1
@JeffC शेल विस्तार के खिलाफ इसे सुरक्षित रखने के \!लिए !ऑपरेटर को उद्धृत करता है । बैकस्लैश वास्तव में यहाँ आवश्यक नहीं है क्योंकि कोई शेल तब तक नहीं फैलता है !जब किसी स्थान का अनुसरण करता है, लेकिन यह चोट नहीं पहुँचाता है। छिपी हुई फ़ाइलों में क्या गलत है?
गिल्स एसओ- बुराई को रोकना '

3

मैंने इस विशिष्ट स्थिति के लिए एक सरल समाधान निकाला है:

rsync --args || $(case "$?" in 0|23) exit 0 ;; *) exit $?; esac)

0यदि रिटर्न दिया गया कोड 0 या 23 था, और अन्य सभी मामलों में निकास कोड लौटाता है।

हालांकि, यह नोट करना महत्वपूर्ण है, कि यह सभी Partial transfer due to errorत्रुटियों को अनदेखा करेगा , न कि केवल अनुमति वाले लोगों को , क्योंकि यह कोड से बाहर निकलने वाली हर चीज को पकड़ लेगा 23। Rsync स्थिति कोड के बारे में अधिक जानकारी के लिए कृपया इस लिंक को देखें ।

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