केवल बाहरी फ़ाइलों को हटाने के लिए rsync का उपयोग करना


13

दो निर्देशिका संरचनाओं की तुलना करने और लक्ष्य स्थान में बाहरी फ़ाइलों और निर्देशिकाओं को हटाने का सबसे अच्छा तरीका क्या है?

मेरे पास एक छोटा सा वेब फोटो गैलरी ऐप है जिसे मैं विकसित कर रहा हूं। उपयोगकर्ता FTP का उपयोग करके चित्र जोड़ते और हटाते हैं। वेब गैलरी सॉफ्टवेयर जो मैंने लिखा है वह मक्खी पर नए थंबनेल बनाता है, लेकिन यह विलोपन से निपटता नहीं है। मैं क्या करना चाहूंगा, पूर्वनिर्धारित अंतराल पर इस बात का ध्यान रखने के लिए एक कमांड / बैश स्क्रिप्ट निर्धारित है।

मूल छवियों को /home/gallery/images/उपनिर्देशिकाओं का उपयोग करके एल्बमों में संग्रहीत और व्यवस्थित किया जाता है। /home/gallery/thumbs/चित्र निर्देशिका के समान निर्देशिका संरचना और फ़ाइल नाम का उपयोग करके थंबनेल को कैश किया जाता है।

मैंने इसे प्राप्त करने के लिए निम्नलिखित का उपयोग करने की कोशिश की है:

rsync  -r --delete --ignore-existing /home/gallery/images /home/gallery/thumbs

यदि सभी थंबनेल पहले ही कैश हो चुके हैं, तो यह ठीक काम करेगा, लेकिन इस बात की कोई गारंटी नहीं है कि ऐसा तब होगा, जब ऐसा होता है, अंगूठे की निर्देशिका में मूल पूर्ण आकार की छवियां हैं।

मैं सबसे अच्छा कैसे हासिल कर सकता हूं जो मैं करने की कोशिश कर रहा हूं?

जवाबों:


8

मुझे नहीं लगता कि rsyncइसके लिए सबसे अच्छा तरीका है। मैं निम्नलिखित की तरह बैश वन-लाइनर का उपयोग करूंगा:

$ cd /home/gallery/thumbs && find . -type f | while read file;do if [ ! -f "../images/$file" ];then echo "$file";fi;done

यदि यह वन-लाइनर फाइलों की सही सूची बनाता है, तो आप इसे rmकमांड के बजाय कमांड चलाने के लिए संशोधित कर सकते हैं echo


धन्यवाद टॉम। मुझे लगता है कि निर्देशिकाओं को भी साफ करने के लिए, मुझे इसे दूसरी बार चलाने की आवश्यकता होगी, लेकिन फाइलों के बजाय कमांड में निर्देशिकाओं को निर्दिष्ट करना, और गूंज को प्रतिस्थापित करना rmdir?
ब्रायन

@ ब्रायन: हाँ जो उचित लगता है। आपको परीक्षण findमें और में झंडे को बदलने की आवश्यकता होगी । बेशक, कृपया मुझे आपके और किसी भी संशोधन के आदेश के साथ बहुत सावधान रहें, और पूरी तरह से परीक्षण करें ! []echo
टॉम शॉ

बहुत धन्यवाद, मैं परीक्षण के दौरान प्रतिध्वनि की प्रचुर मात्रा में आवेदन करूँगा।
ब्रायन

1
बस एक विचार था: आप "ls" के साथ परीक्षण कर सकते हैं यह सुनिश्चित करने के लिए कि यह व्हाट्सएप के साथ अच्छी तरह से काम करता है। शुभकामनाएँ।
टॉम शॉ

34

आपको --existingभी चाहिए:

rsync -r --delete --existing --ignore-existing /home/gallery/images /home/gallery/thumbs

मैनपेज से:

  --existing, --ignore-non-existing
          This tells rsync to skip creating files (including  directories)
          that  do  not  exist  yet on the destination.  If this option is
          combined with the --ignore-existing option,  no  files  will  be
          updated  (which  can  be  useful if all you want to do is delete
          extraneous files).

1
यदि कोई त्रुटि है, तो आपका भयानक जवाब काम नहीं करेगा। इसलिए आपको --ignore-errorsतर्क को भी जोड़ना होगा । बस यही एक चीज है जो मेरे लिए काम करती है। आप के लिए धन्यवाद --existingऔर --ignore-existing! मैंने आपके उत्तर का उपयोग यहाँ मेरे उत्तर के आधार के रूप में किया है
लोनीबेस्ट

1
@ लोनीस्टेस्ट यदि त्रुटियां हैं, तो भी नहीं rm, cpया mvयह काम करेगा कि त्रुटियां क्या हैं: वे समस्याएं हैं जिन पर ध्यान दिया जाना चाहिए और जो ऑपरेशन को सफल होने से रोकते हैं। आप अधिकांश टूल को त्रुटियों को अनदेखा करने के लिए निर्देश दे सकते हैं (उदाहरण के -fलिए rm) लेकिन मैं यह नहीं देखता कि यह प्रश्न या इस उत्तर के लिए प्रासंगिक कैसे है।
मीकी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.