रुपीस --delete विकल्प लक्ष्य निर्देशिका में फ़ाइलों को नष्ट नहीं करता है


14

मैं लक्ष्य निर्देशिका में फ़ाइलों को हटाने के लिए --deleteविकल्प का उपयोग करने की कोशिश कर रहा हूं rsyncजो मूल निर्देशिका में मौजूद नहीं है

यहाँ कमांड का उपयोग कर रहा हूँ:

rsync -avz --ignore-existing --recursive --delete /var/www/* root@mydomaintest.com:/var/www

तो मेरा सवाल यह है कि मैं लक्ष्य निर्देशिका में सभी फाइलें कैसे हटा सकता हूं जो मूल निर्देशिका में मौजूद नहीं हैं?

जवाबों:


14

इस कमांड का उपयोग करें:

rsync --archive --verbose --compress --ignore-existing --delete /var/www/ root@mydomaintest.com:/var/www

आपको "*" की आवश्यकता नहीं है और इसका उपयोग भी नहीं करना चाहिए।

फ़ाइलों या निर्देशिकाओं को बाहर करने / शामिल करने के लिए, आपको इस पैरामीटर का उपयोग करना चाहिए:

--exclude 'to_exclude*'
--include 'to_include*'

ठीक है मुझे इसकी कोशिश करें :)
user2028856

2
तो क्या "*" जो --delete कमांड काम नहीं कर रहा है?
user2028856

2
यह कैसा लग रहा है। :)
एबी


1
"*" कुछ मामलों में महत्वपूर्ण हो सकता है क्योंकि यह उन फ़ाइलों / निर्देशिकाओं को शामिल करता है जो "" से शुरू होती हैं। उदाहरण के लिए मैं इसका उपयोग rsync का उपयोग करते समय एक विकास मशीन से उत्पादन मशीन के लिए बनाए गए निर्देशिका की प्रतिलिपि बनाने के लिए करता हूं। मैं .git रिपोजिटरी डायरेक्टरी, या .gitignore जैसी फाइलों को सिंक नहीं करना चाहता, सिर्फ काम करने वाले पेड़ को, टॉप-लेवल पर और साथ ही उपनिर्देशिकाओं की फाइलों सहित।
सॉट्सनूट

14

जब आप उपयोग कर रहे थे तब आपकी कमांड काम नहीं कर रही थी /var/www/* स्रोत के रूप में , तो आपका शेल उस पर ग्लोबिंग कर रहा है अर्थात शेल *उस डायरेक्टरी की सभी फाइलों में विस्तार कर रहा है और फाइलों को एक-एक करके कॉपी करता जा रहा है, इसलिए यहां व्यक्तिगत फाइल्स के बजाय स्रोत बन गए हैं मूल निर्देशिका।

इसलिए, यदि आप उपयोग करते हैं /var/www/*, तो आपको --recursiveविकल्प की आवश्यकता नहीं है क्योंकि *फ़ाइलों को कॉपी करने का कारण होगा (किसी भी निर्देशिका के साथ उनकी सामग्री के साथ), न कि माता-पिता की निर्देशिका जिसमें फाइलें शामिल हैं। उसी कारण --deleteसे काम नहीं कर रहा है, क्योंकि --deleteगंतव्य निर्देशिका से फ़ाइलें निकाल देगा जो स्रोत निर्देशिका में नहीं हैं , लेकिन आप फ़ाइलों को कॉपी कर रहे हैं ताकि इसकी फ़ाइलों को हटा न सकें (अपेक्षित रूप से)।

यह आपको अधिक स्पष्ट करेगा:

/foo$ ls -l
-rw-rw-r-- 1 user user    0 Apr 16 17:56 egg
-rw-rw-r-- 1 user user    0 Apr 16 17:56 spam
drwxrwxr-x 2 user user 4096 Apr 16 18:14 test


/bar$ ls -l
-rw-rw-r-- 1 user user 0 Apr 16 17:56 egg
-rw-rw-r-- 1 user user 0 Apr 16 18:13 lion
-rw-rw-r-- 1 user user 0 Apr 16 17:56 spam


$ rsync -avz --ignore-existing --recursive --delete 
/foo/* /bar/

+ rsync -avz --ignore-existing --recursive --delete 
/foo/egg /foo/spam /foo/test /bar/

sending incremental file list
test/
test/hello

sent 173 bytes  received 39 bytes  424.00 bytes/sec
total size is 0  speedup is 0.00


/bar$ ls -l
-rw-rw-r-- 1 user user    0 Apr 16 17:56 egg
-rw-rw-r-- 1 user user    0 Apr 16 18:13 lion
-rw-rw-r-- 1 user user    0 Apr 16 17:56 spam
drwxrwxr-x 2 user user 4096 Apr 16 18:14 test

जैसा कि आप देख सकते हैं, मैंने स्रोत का उपयोग किया है /foo/*इसलिए rsyncकमांड को निष्पादित किया जा रहा है

rsync -avz --ignore-existing --recursive --delete /foo/egg 
/foo/spam /foo/test /bar/

साथ *खोल जिससे यह विस्तार करने के लिए और स्रोत तर्क, नहीं एक पूरे के रूप मूल निर्देशिका के रूप में व्यक्तिगत रूप से सभी फाइलों को बनाने (और आप भी जरूरत नहीं है --recursiveइस मामले में)।

इसलिए, यदि आप --deleteकाम करना चाहते हैं, तो इसे निम्नानुसार चलाएं:

rsync -avz --ignore-existing --recursive --delete 
/var/www/ root@mydomaintest.com:/var/www/

4
उत्कृष्ट विवरण वास्तविक मुद्दे की ओर इशारा करते हुए: स्रोत सूची का विस्तार करने के लिए '*' का उपयोग करते हुए।
एंटोनियो बार्डाज़ज़ी

जैसा कि स्वीकृत उत्तर पर मेरी टिप्पणी में उल्लेख किया गया है, * "और" के साथ शुरू होने वाली फ़ाइलों और निर्देशिका जैसी चीजों को बाहर करने के लिए उपयोगी हो सकता है। यद्यपि आप ध्यान दें, इसका मतलब है कि स्रोत में शीर्ष स्तर से हटाए गए फ़ाइलों और निर्देशिकाओं को गंतव्य निर्देशिका से हटाया नहीं जाएगा। खुद के लिए, मुझे परवाह नहीं है कि क्या शीर्ष-स्तरीय फाइलें गंतव्य से ठीक से हटा दी जाती हैं, केवल उपनिर्देशिका से नीचे की फाइलें मायने रखती हैं। शीर्ष-स्तरीय उपनिर्देशिका को हटाना एक जोड़ने की तुलना में बहुत कम है, और मैं उस असंभावित मामले में गंतव्य पर एक मैनुअल आरएम -आर करने के लिए तैयार हूं।
भूतपूर्व सैनिक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.