मैं स्रोत फ़ोल्डर से हटाई गई फ़ाइलों को rsync डिलीट कैसे करूं?


194

मैंने हाल ही में गेम सर्वर को होस्ट करने के लिए उबंटू सर्वर के साथ एक मशीन स्थापित की है। मैंने प्रत्येक गेम सर्वर के लिए एक बैकअप प्लगइन स्थापित किया जो मशीन पर एक विशेष फ़ोल्डर में गेम वर्ल्ड फ़ाइलों का लगातार बैकअप बनाता है। मैंने विकल्प के cronसाथ rsync का उपयोग करके हर रात अपने ड्रॉपबॉक्स फ़ोल्डर में स्वचालित रूप से उन बैकअप को कॉपी करने के लिए एक कार्य स्थापित किया -a

कुछ महीनों के बाद मेरा ड्रॉपबॉक्स खाता अपनी भंडारण सीमा तक पहुंच गया और मुझे एहसास हुआ कि मैं इतने सारे बैकअप नहीं रख पाऊंगा, इसलिए मैंने गेम सर्वर बैकअप प्लगइन को इतने सारे बैकअप नहीं बनाए रखने के लिए कॉन्फ़िगर किया, फिर कुछ दिन इंतजार किया कि क्या यह देखने के लिए होगा? पुराने बैकअप हटा दें क्योंकि यह साप्ताहिक आधार पर करने के लिए निर्धारित है। बैकअप प्लगइन ने अंततः अपना काम किया और पुराने बैकअप को हटा दिया, इसलिए मुझे rsyncस्रोत फ़ोल्डर से मिलान करने के लिए अपने ड्रॉपबॉक्स फ़ोल्डर से पुराने बैकअप को हटाने के लिए क्रोन कार्य की उम्मीद थी , लेकिन ऐसा नहीं किया है। इसलिए मेरे पास कुछ सवाल हैं:

  • डिफ़ॉल्ट रूप से, है rsyncकेवल जोड़ने कि स्रोत फ़ोल्डर में जोड़ा गया है गंतव्य फ़ोल्डर में फ़ाइलों और बदल फ़ाइलों को स्रोत फ़ोल्डर में बदल दिया गया है, लेकिन नहीं हटा सकते है कि स्रोत फ़ोल्डर से हटा दिया गया फ़ाइलें?

  • अगर ऐसा है, तो ऐसा करने का सबसे अच्छा तरीका क्या है rsync? मैं गंतव्य फ़ोल्डर को स्रोत फ़ोल्डर को पूरी तरह से प्रतिबिंबित करना चाहता हूं, और इसका मतलब है कि स्रोत फ़ोल्डर से हटा दी गई किसी भी फाइल को हटाना।

मैं मैनुअल पेज में सूचीबद्ध कुछ विकल्प देख rsyncसकता हूं जो कि कर सकते हैं, लेकिन जब से मैं परिचित नहीं हूं।

जवाबों:


227

लक्ष्य में फ़ाइलों को हटाने के --deleteलिए, अपने कमांड में विकल्प जोड़ें । उदाहरण के लिए:

rsync -avh source/ dest/ --delete

15
सुनिश्चित करें कि स्रोत एक निर्देशिका है। का उपयोग करते हुए source/* dest/काम नहीं करेगा।
बजे टॉम सालेबा

3
मैं के साथ कि घटना पाया --deleteया --delete-afterयह है क्योंकि कुछ त्रुटियों की नहीं हटेंगे: "आईओ त्रुटि आई - फ़ाइल हटाने की लंघन"। इस --ignore-errorsविकल्प को हल करने के लिए और त्रुटियों को अलग से डीबग करें
MHT

12
अच्छी तरह से काम! भले ही यह काम कर रहा है, मैं -n, --dry-runचलने से पहले ALWAYS के उपयोग के विकल्प की सिफारिश करूंगा rsync, विशेष रूप से जब यह इन जैसे विकल्पों की बात आती है ( --delete)। यह किसी भी संभावित सिरदर्द से बच जाएगा :)।
ivanleoncz

2
@ एमएचटी: कोई भी जवाब आपकी टिप्पणी के बिना पूरा नहीं होता है।
लोनी बेस्ट

2
@TheBicentennialMan का -a अर्थ है -r
x-yuri

45

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

मेरा सुझाव है कि आप rsyncस्रोत फ़ाइलों से बैकअप बनाने के लिए उपयोग करें और find ... rmफ़ाइलों के समय या आकार के लिए विलोपन फ़ाइलों के लिए उपयोग करें:

rsync [options] SOURCE TARGET
find TARGET -maxdepth 1 -type f -mtime +60 -exec rm -f {} \;

उपरोक्त कोड ब्लॉक, स्रोत से बैकअप बनाते हैं और फिर प्रत्येक फ़ाइलों को हटाते हैं जो अंतिम संशोधित समय 2 महीने से अधिक हैं।

अपडेट करें

जैसा कि मैंने पाया कि deleteविकल्प केवल TARGET के लिए हैं कि यदि कुछ फ़ाइलें स्रोत से हटा दी जाती हैं, तो rsync --deleteउन्हें TARGET से हटा दें। और deleteसे विकल्प afterऔर before, अपने आदमी पेज में उल्लिखित:

--delete-before         receiver deletes before transfer, not during

मतलब कि:

  1. rsync फाइल को TARGET से हटाता है जो SOURCE से हटा दी जाती है।
  2. rsync फ़ाइलों को सिंक्रनाइज़ करना प्रारंभ करता है।

--delete-after receiver deletes after transfer, not during

मतलब कि:

  1. rsync फ़ाइलों को सिंक्रनाइज़ करना प्रारंभ करता है।
  2. rsync ने फ़ाइल को TARGET से हटा दिया जिसे सिंक करने के बाद SOURCE से हटा दिया गया है।

ध्यान दें : --delete-{before/after}सिर्फ TARGET में लागू करें।


1
उत्तर के लिए धन्यवाद!! क्या आप rsync के लिए "हटाएं" विकल्प की बात कर रहे हैं? मैं केवल rsync के लिए "हटाएं" विकल्प का उपयोग क्यों नहीं कर सकता?
user254251

@ user254251, यदि आप डिलीट का उपयोग करते हैं, तो rsync कमांड तुरंत फाइल्स डिलीट कर देता है। लेकिन इस मामले में किसी भी त्रुटि के लिए अधिक समय है।
shgnInc

अगर मैं सही तरीके से समझूं, तो आप कह रहे हैं कि त्रुटियों से बचने के लिए मुझे rsync कार्य से विलोपन कार्य को अलग करना चाहिए। हालांकि हमारे पास एक सवाल है। Rsync के लिए मैनुअल पेज कुछ विकल्पों को सूचीबद्ध करता है जो प्रतिलिपि कार्य से पहले या बाद में हटाकर इसे हटाने के कार्य को अलग करने के उद्देश्य से दिखाई देते हैं। उदाहरण के लिए, मुझे दो विकल्प मिलते हैं, जिन्हें --delete-before और --delete-after कहा जाता है। इन विकल्पों के साथ rsync का आपके द्वारा वर्णित विधि के समान प्रभाव होगा? मैंने मैनुअल पेज पर प्रत्येक विकल्प का पूरा विवरण पढ़ा है लेकिन विवरण में कुछ जानकारी है जो मुझे समझ में नहीं आती है।
user254251

@ user254251, उत्तर अपडेट किया गया था। मुझे नहीं पता कि rsync में समय सीमा द्वारा TARGET से फ़ाइलों को हटाने का कोई तरीका है ।
shgnInc

धन्यवाद! तो क्या आपको लगता है कि मैं त्रुटियों से सुरक्षित हूं अगर मैं बस --delete- से पहले विकल्प का उपयोग करता हूं? मैं एक टाइमआउट निर्दिष्ट नहीं कर रहा हूं, इसलिए मुझे चिंता नहीं करनी चाहिए अगर rsync विलोपन चरण हस्तांतरण चरण को विलंबित करता है। rsync प्रति दिन एक बार चलता है और अगले सिंक से पहले बैकअप फ़ाइलों को सिंक करने के लिए बहुत समय है, इसलिए मुझे सिंक को समय-सीमा तक सीमित करने की आवश्यकता नहीं है।
user254251

6

यह कमांड इंक्रीमेंट डेटा को कॉपी करेगा और रिमोट सर्वर के साथ सिंक में रखेगा।

  1. यह केवल वृद्धिशील डेटा की नकल करेगा।
  2. यदि स्रोत से कोई डेटा हटा दिया गया है, तो वह हटा देगा।
  3. यदि गंतव्य पर कोई डेटा हटा दिया गया है तो यह फिर से स्रोत से कॉपी हो जाएगा।
  4. मूल रूप से यह कमांड दोनों वातावरण को सिंक में रखेगा।

rsync -avWe ssh --delete-before (source) root@localhost:(destination) rsync -avW --delete-before -e ssh (source) root@localhost:(destination)

उदाहरण:

rsync -avWe ssh --delete-before /data root@192.168.254.254:/backup
rsync -avW --delete-before -e ssh /data root@192.168.254.254:/backup

2
मुझे लगता है-यह केवल वृद्धिशील डेटा की प्रतिलिपि बनाने के लिए नहीं बल्कि हमेशा संपूर्ण फ़ाइलों की प्रतिलिपि बनाने के लिए बनाता है।
ट्यूलेंस कोर्डोवा

इस कमांड को निष्पादित करके मुझे यह त्रुटि मिली: rsync: Failed to exec --delete-before: No such file or directory (2)
जेफ तियान

1

वहाँ एक rsync scync दौरान किसी भी त्रुटि कर रहे हैं, rsync ठीक से, फ़ाइलों को यह करना चाहिए था नहीं हटेंगे, भले ही आप का इस्तेमाल किया --delete, --delete-afterया --delete-before

यही कारण है कि rsync त्रुटियों को संबोधित करना महत्वपूर्ण है।

मेरी अधिकांश त्रुटियां --permsनॉन-लिनक्स फाइल सिस्टम के साथ सिंक करते समय विकल्प का उपयोग करने के कारण थीं । जब मैंने प्रतिस्थापित --permsकिया --no-perms, तो वे त्रुटियां दूर हो गईं और फिर काम हटा दिया गया।

--permsजब आप लिनक्स फाइल सिस्टम से दूसरे लिनक्स फाइल सिस्टम में सिंक कर रहे हों तो ठीक है, लेकिन अगर आप लिनक्स से नॉन-लिनक्स फाइल सिस्टम (जैसे एनटीएफएस, एफएटी) में सिंक कर रहे हैं, तो --permsत्रुटि का कारण बनता है क्योंकि rsync लिनक्स पर अनुमतियों को सेट नहीं कर सकता है गैर-लिनक्स फ़ाइल सिस्टम । फिर से, त्रुटियाँ = कोई हटा नहीं।

- जब एक गैर लिनक्स विभाजन के समन्वयन के, मैं का उपयोग --no-permsउन त्रुटियों से बचने के लिए है कि तोड़-फोड़ --delete, --delete-after, या --delete-before

यदि आपको इसके बाद भी त्रुटियां मिलती हैं, और यह पता नहीं लगा सकते हैं कि उन त्रुटियों को कैसे दूर किया जाए, तो आप एक कमांड चला सकते हैं जो विशेष रूप से आउट-ऑफ-सिंक फ़ाइलों को हटाने के लिए समर्पित है:

sudo rsync -r --delete --existing --ignore-existing --ignore-errors --progress /path/to/source/ /path/to/destination

ऊपर दिया गया कमांड सिंक से बाहर का सामान हटा देगा, लेकिन किसी भी फाइल को सिंक नहीं करेगा। तो, आपको इसके बाद फिर से सिंक करना चाहिए। यह आदेश इस उत्तर पर आधारित है , सिवाय इसके कि मैंने --ignore-errorsतर्क भी जोड़ा है , इसलिए यदि त्रुटियां हैं तो भी इसे हटा दिया जाएगा।


1
पारितोषिक के लिए धन्यवाद! मैं 5 साल पहले इस प्रश्न का मूल लेखक हूं। मुझे वास्तव में खुशी है कि आपने इसे पोस्ट किया है, क्यूज मैं निकट भविष्य में NTFS ड्राइव के लिए सिंकिंग सेट करने की योजना बना रहा हूं, और मैं शायद अनुमति त्रुटि में चला गया होगा क्योंकि मैं "-a" विकल्प का उपयोग करने की योजना बना रहा था rsync, जो अनुमति (अन्य चीजों के बीच) को सिंक करता है। इसलिए मैंने अपने नोट्स में "-नो-परमिट" जोड़ा। अब मैं rsync -a --no-perms --delete-before का उपयोग करने की योजना बना रहा हूं। मेरे पास एक सवाल है: क्या इससे पहले कि सिंक के पहले डिलीट करने से फाइल डिलीट करने में कोई दिक्कत नहीं होगी? सोचा कि इसका उद्देश्य था।
user254251

@ user254251 - मैं निश्चित नहीं हूँ। मुझे लगता है कि यह इस बात पर निर्भर करेगा कि यह वास्तव में "इससे पहले कैसे हटाता है"। यदि यह कुछ हटाने के शुरू होने से पहले एक त्रुटि का सामना करता है, तो आपके पेंच। मेरी आपको सलाह है कि आप NTFS से कभी भी बचें जब तक आप अपनी गांड में तेज दर्द पसंद न करें :)। NTFS से NTFS ठीक काम करता है। NTFS से Linix ठीक काम करता है। "लिनक्स फाइल सिस्टम" से "नॉन-लिनक्स फाइल सिस्टम" से बचें; कामों को सही तरीके से हटाने के लिए यह बहुत अधिक दर्द है। आप इसे पूरा कर सकते हैं, लेकिन मैंने तय किया कि यह परेशानी के लायक नहीं है, बस गंतव्य ड्राइव को EXT4 के रूप में प्रारूपित करें।
लोनी बेस्ट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.