RSYNC स्रोत निर्देशिकाओं को नहीं हटाता है


27

मैं rsync का उपयोग सर्वर से आवश्यक फ़ाइलों को लाने के लिए कर रहा हूं, फिर एक बार स्थानीय स्तर पर फ़ाइलों को सर्वर से हटा दें। मेरे द्वारा चलायी जा रही पूरी कमांड नीचे है।

यह स्रोत सर्वर पर फ़ाइलों को सफलतापूर्वक हटाता है, हालांकि खाली निर्देशिका अभी भी बनी हुई है। मुझे कोई संदेश या त्रुटियाँ नहीं मिलीं। सभी आउटपुट सामान्य है। शायद यही अभीष्ट कार्यक्षमता है।

मैं निर्देशिका सहित सब कुछ साफ करने के लिए rsync कैसे बता सकता हूं?

rsync --progress -vrzh --remove-source-files

दोनों छोरों पर संस्करण 3.0.9 है।


जवाबों:


13

आपके द्वारा देखा गया व्यवहार --remove-source-filesठीक उसी के द्वारा निर्दिष्ट है man rsync:

--remove स्रोत-फ़ाइलें

   This tells rsync to remove from the sending side the files (meaning non-directories) that are a part of the transfer and have been successfully duplicated on the receiving side.

के रूप में इन दो विचार विमर्श वहाँ, निर्देशिका दूर करने के लिए कोई विशेष आदेश है StackExchange और ServerFault स्पष्ट रूप से दिखाई देते हैं। समाधान का सुझाव दिया गया है कि दो अलग-अलग कमांड जारी करें:

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

इन दो पदों में सुझाए गए आदेश का अंतिम टुकड़ा,

 rmdir source/

जिसे (अब खाली कर दिया गया है) स्रोत निर्देशिका को इन पदों पर हटाने की आवश्यकता है क्योंकि ओपी और जवाब एक ही मशीन के भीतर बड़ी मात्रा में फ़ाइलों को स्थानांतरित करने के लिए rsync का उपयोग कर रहे हैं। आपके मामले में आपको इसे मैन्युअल रूप से करना होगा।


5
यह rsync --deleteसुझाव खतरनाक है, क्योंकि यह इस संभावना की अनदेखी करता है कि rsync पूरा नहीं हुआ, या स्रोत पर नई फाइलें हैं। @ findनीचे slhck की विधि ज्यादा सुरक्षित है।
साईं

29

मैनपेज भी कहता है:

--remove-source-files   sender removes synchronized files (non-dirs)

यदि आप अपने स्रोत में खाली निर्देशिकाओं को हटाना चाहते हैं, यदि अभी भी फाइलें शेष हैं, तो a: करें

find . -depth -type d -empty -delete

लेकिन एक खाली रूट निर्देशिका के लिए, rm -rf <directory>निश्चित रूप से पर्याप्त होगा।


5
हाँ, यह एकमात्र उपाय है। यह rsync की एक मूर्खतापूर्ण अनुपलब्ध सुविधा की तरह है ... rsync को पता है कि यह एक निर्देशिका में अंतिम फ़ाइल को कब संसाधित करता है ... यह बहुत आसान है कि यह खाली होने पर भी dir को हटा दिया जाए।
एरिक एरोनेस्टी

4
खबरदार कि "आरएम-आरएफ" जारी करना दौड़ की स्थिति है और मैं इसे हतोत्साहित करता हूं।
राउल सालिनास-मोंटियागुडो

वेरिएंट जो शीर्ष स्तर की खाली निर्देशिका को find some_dir -depth -type d -empty -not -path some_dir -delete
मिटाता नहीं है

5

" Rm -rf " का उपयोग एक अंतर्निहित दौड़ की स्थिति है, आप अर्थात् उन फ़ाइलों को हटा सकते हैं जो सिर्फ rsync और rm इनवोकेशन के बीच बनाई गई थीं ।

मैं उपयोग करना पसंद करता हूं:

rsync --remove-source-files -a सर्वर: इनकमिंग / इनकमिंग / &&

ssh सर्वर इनकमिंग -डाइप ddelete को खोजता है

यदि वे रिक्त नहीं हैं तो यह निर्देशिकाओं को नहीं निकालेगा।


2
उन rm -rfफ़ाइलों को भी हटा देगा जिन्हें किसी कारण से स्थानांतरित नहीं किया गया था।
क्रिस्टियन

1
यह उत्तर उस -depthविकल्प को याद करता है जो findसही क्रम में प्रक्रिया करने का निर्देश देता है। इस मिस के परिणामस्वरूप, केवल खाली निर्देशिका (संभवतः पुनरावर्ती) वाली निर्देशिकाओं को हटाया नहीं जाएगा। @Slhck के वेरिएंट में यह सही है।
स्टीफन गौरीचोन

1

-m, --prune-empty-dirs फ़ाइल-सूची से खाली निर्देशिका श्रृंखलाओं को prune करें

--force खाली न होने पर भी डायर को हटाने के लिए बाध्य करना


1
यह सिर्फ rsync को खाली dirs की प्रतिलिपि बनाने से रोकता है। यह खाली dirs नहीं हटाता है।
नवीन

1

स्रोत फ़ाइलों को निकालें, फिर सुरक्षित होने के लिए निर्देशिकाओं को हटा दें।

# given this scenario where you generate folders 2014-01-01 etc.. that have an archive myfile.tar.gz
pushd $(mktemp -d)
mkdir 201{4..6}-{01..12}-{01..31}
for i in $(ls); do; touch $i/myfile.tar.gz;done;
# find and rsync on 10 CPU threads directories that match ./2015-*
find /tmp/tmp.yjDyF1jN70/src -type d -name '2015-*' | \
parallel \
--jobs 10 \
--progress \
--eta \
--round-robin \
rsync \
--hard-links \
--archive --verbose --protect-args \
--remove-source-files \
{} /tmp/tmp.yjDyF1jN70/dest
# now safely remove empty directories only
for i in $(ls /tmp/tmp.yjDyF1jN70/src); do; rmdir /tmp/tmp.yjDyF1jN70/src/$i; done;

जीएनयू समानांतर पर अधिक

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