फ़ाइलें ले जाएँ और निर्देशिकाओं को rsync से हटाएं?


17

हाल ही में मुझे बड़ी संख्या में फ़ाइलों (1 मिलियन से अधिक) को हटाने की आवश्यकता थी और मैंने यह करते हुए पढ़ा:

rsync -av --delete `mktemp -d`/ ~/source && rmdir ~/source

ऐसा करने के लिए सबसे अधिक अनुकूलित तरीकों में से एक था, और मैं यह प्रतिज्ञा कर सकता हूं कि यह इससे तेज है rm -rf

मैं इस मामले का विशेषज्ञ नहीं हूं, लेकिन मेरी समझ से rsync प्रदर्शन का कारण कुछ ऐसा करने का तरीका है जो फाइलों को सूचीबद्ध करता है (LIFO के बजाय FIFO I suppose)। अब, समस्या यह है, मुझे एक कुशल तरीके से बड़ी संख्या में फ़ाइलों को स्थानांतरित करने की भी आवश्यकता है। थोड़ा खोज करने के बाद, मैंने पाया:

rsync -av --ignore-existing --remove-source-files ~/source ~/destination

हालांकि यह सभी स्थानांतरित फ़ाइलों को हटा देता है ~/source, निर्देशिकाएं वहीं रहती हैं। चूंकि मेरे पास "राउंड-रॉबिन" जैसी निर्देशिका संरचना है, जिनकी संख्या files/directories1 के बहुत करीब है, इसलिए मुझे पूरी तरह से निर्देशिका से छुटकारा पाने के लिए पहला कमांड चलाने के लिए मजबूर किया गया है:

rsync -av --ignore-existing --remove-source-files ~/source ~/destination && \
rsync -av --delete `mktemp -d`/ ~/source && rmdir ~/source

एक सीधे mvवस्तुतः तुरंत खत्म हो जाएगा, लेकिन मेरी ~/destinationनिर्देशिका में फ़ाइलें हैं जिन्हें रखा जाना चाहिए, इसलिए mvएक विकल्प नहीं है। मुझे --prune-empty-dirsऔर --forcersync विकल्प मिले, लेकिन न तो वह काम करना चाहिए जैसा मैं उम्मीद करूंगा:

--force                 force deletion of directories even if not empty
--prune-empty-dirs      prune empty directory chains from the file-list
--remove-source-files   sender removes synchronized files (non-dirs)

वहाँ एक रास्ता rsync के साथ एक चाल की नकल करने के लिए एक रास्ता है ?


2
यदि आपको यहां कोई उत्तर नहीं मिलता है, तो rsync सूची पर पोस्ट करने का प्रयास करें। वे बहुत सहायक हैं। lists.samba.org/mailman/listinfo/rsync
जो

जवाबों:


7

मुझे स्टैकओवरफ़्लो शीर्षक पर यह थ्रेड मिला: rsync "मूव" के साथ फ़ोल्डर हटाना? , जो अनिवार्य रूप से एक ही सवाल पूछ रहा है। rsync2 कमांडों में से एक का जवाब देने का सुझाव दिया गया क्योंकि ऐसा प्रतीत होता है कि एक भी कमांड नहीं है जो फाइलों और स्रोत निर्देशिकाओं की चाल / निष्कासन को पूरा कर सके।

$ rsync -av --ignore-existing --remove-source-files source/ destination/ && \
  rsync -av --delete `mktemp -d`/ source/ && rmdir source/

वैकल्पिक रूप से आप इसे इस कमांड का उपयोग करके कर सकते हैं:

$ rsync -axvvES --remove-source-files source_directory /destination/ && \
  rm -rf source_directory

आदर्श नहीं है लेकिन काम करता है।


हां, यह मैं था जिसने उस सवाल का जवाब दिया (और वही "समाधान" भी इस सवाल पर है)। = पी
एलिक्स एक्सल

@AlixAxel - हा, क्षमा करें, मैंने यह भी नहीं देखा कि आपने इसका उत्तर दिया है। ओह अच्छा। क्या मैं इस उत्तर को हटा दूं?
slm

3
rsyncPrune निर्देशिकाओं का उपयोग करना सही नहीं लगता है और इसके साथ हमेशा खतरा रहता है rm -rf। मैं दूसरा कदम रखने की सलाह find source/ -d -type d -exec rmdir {} \;
दूंगा

2
मैं बस जोड़ने के लिए मजबूर महसूस करता हूं, कभी भी उपयोग न करें -deleteऔर --remove-source-filesएक एकल rsync कमांड में (उपरोक्त उदाहरण ठीक हैं, यह स्पर्शरेखा है)। यदि आप बाधित करते हैं तो मैं जो वर्णन कर रहा हूं, उसे फिर से निष्पादित करें, आप स्थानांतरित फ़ाइलों को खो देंगे। जो मैंने पहले किया है :(
श्रीधर सरनोबत

जब सफाई के साथ find, मैं इसे पसंद करता हूं: find source/ -type d -empty -delete यह मुझे आश्वस्त करने का एक अजीब अर्थ देता है कि यह सब कुछ ठीक नहीं करेगा।
ग्रेफेड 22

10

Zany की टिप्पणी से लेकर स्लम के उत्तर ( फाइलों को स्थानांतरित करें और rsync के साथ निर्देशिकाओं को हटाएं? ) मैं इन 2 कमांडों को एक उत्तर के रूप में सुझाऊंगा:

rsync -av --ignore-existing --remove-source-files source/ destination/ && \
find source/ -depth -type d  -empty -exec rmdir "{}" \;

फायदा यह है कि, जैसा कि zany ने कहा, rm -rf का उपयोग करने में अभी भी कुछ खतरा है, यदि आप इसे सही नहीं मानते हैं या शुरुआती के लिए।

मैंने 2 विकल्प जोड़े, -depth और -empty और जबकि मुझे यकीन नहीं है कि यह वास्तव में आवश्यक है, तो यह 2 कमांड को अन्य स्थितियों के लिए अधिक पोर्टेबल बनाता है और इससे भी अधिक सुरक्षित है (यह अभी भी सही काम करता है अगर कुछ निर्देशिकाएं खाली नहीं हैं और डायरेक्टरी ट्री में सबसे गहरे बिंदु से हटाना शुरू करता है)


सिर्फ -deleteइसके बजाय क्यों नहीं -exec rmdir {} \;?
उड़ान भेड़

@flying_sheep सिम के जवाब में user7000 की टिप्पणी देखें: जब rsync ist बाधित हो जाए तो आप फ़ाइलों को ढीला कर सकते हैं
mit

जब rsync बाधित होता है, तो खोज कभी शुरू नहीं होती है या नहीं? इसलिए दूसरे rsync में -delete को कोई समस्या नहीं होनी चाहिए। लेकिन -delete फाइलें भी हटा देते हैं, इसके बजाय rmdir कभी भी फाइल्स को डिलीट नहीं करते हैं, केवल डायरेक्टरी होते हैं। दोनों (-dlete और rmdir) निर्देशिकाओं की जाँच करें यदि वे हटाने से पहले खाली हैं।
बेन्बा

इसके अलावा मैन पेज का कहना है कि यू का उपयोग करना चाहिए -execdir के बजाय -execir ...
benba

2

यह एक कदम में काम करता है। स्रोत और लक्ष्य पथ दोनों पर अनुगामी / स्लैश / नोट करें।

rsync \
    -ruval \
    --ignore-existing \
    --remove-source-files \
    --prune-empty-dirs \ 
    /source/path/ /target/path/

मैं user7000 से सावधानी बरतने के लिए --deleteऔर --remove-source-filesएक ही कॉल में एक साथ कॉल करने के लिए गूंजता हूं rsync। यदि ऑपरेशन विफल हो जाता है या बाधित होता है और उसी कॉल को दोहराया जाता है, तो आप डेटा खो देंगे। यदि किसी भी संदेह में, --dry-runयह देखने के लिए विकल्प का उपयोग करें कि क्या किया जाएगा।


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