rsync गंतव्य पर फ़ाइलों को नहीं हटाएगा


22

मैं एक निर्देशिका को दर्पण करने की कोशिश कर रहा हूं जो समय के साथ दूसरी निर्देशिका में बदलती है। मेरी समस्या यह है कि अगर वे स्रोत निर्देशिका में अब भी मौजूद नहीं हैं, तो rsync गंतव्य पर फ़ाइलों को हटा नहीं रहा है। यहाँ एक डेमो स्क्रिप्ट है:

#!/bin/sh

set -x

DIR1=/tmp/1
DIR2=/tmp/2

rm -rf $DIR1
rm -rf $DIR2

mkdir $DIR1
mkdir $DIR2

echo "foo" > $DIR1/a
echo "bar" > $DIR1/b

rsync -a $DIR1/* $DIR2

rm -f $DIR1/a

rsync -a --delete $DIR1/* $DIR2

ls -1 $DIR2

यहाँ उत्पादन है:

+ DIR1=/tmp/1
+ DIR2=/tmp/2
+ rm -rf /tmp/1
+ rm -rf /tmp/2
+ mkdir /tmp/1
+ mkdir /tmp/2
+ echo foo
+ echo bar
+ rsync -a /tmp/1/a /tmp/1/b /tmp/2
+ rm -f /tmp/1/a
+ rsync -a --delete /tmp/1/b /tmp/2
+ ls -1 /tmp/2
a
b

जैसा कि आप देख सकते हैं, फ़ाइल "ए" गंतव्य निर्देशिका में rsync के दूसरी बार चलने के बाद भी मौजूद है, जो कि मेरी ज़रूरत नहीं है। क्या मैं '--delete' विकल्प का दुरुपयोग कर रहा हूं?


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

जवाबों:


9

इसका कारण यह है कि आप rsync को / tmp / 1 / b पर कॉल कर रहे हैं, जो / tmp / 1 / a फाइल पर विचार नहीं करेगा।

आपका इरादा निर्देशिका / tmp / 1 / - को rsync करने का प्रतीत होता है, यदि आप अलग-अलग फ़ाइलों के बजाय स्रोत के रूप में "/ tmp / 1 /" का उपयोग करते हैं, तो यह ध्यान देगा कि "a" को निर्देशिका से हटा दिया गया है और हटा दें यह लक्ष्य से।


23

निकालें *। जैसा कि rsync मैन पेज में बताया गया है --deleteविकल्प वाइल्डकार्ड प्रविष्टियों के साथ काम नहीं करता है।

इसके बजाय इसका उपयोग करें:

rsync -a --delete $DIR1/ $DIR2/

"- डिलिट यह rsync को रिसीरिंग फाइल्स को रिसीविंग साइड (जो कि सेंडिंग साइड पर नहीं हैं) से डिलीट करने के लिए कहता है, लेकिन केवल उन डाइरेक्टरीज़ के लिए जिन्हें सिंक्रोनाइज़ किया जा रहा है। आपने rsync को पूरी डायरेक्टरी भेजने के लिए कहा होगा (जैसे dirया dir/) निर्देशिका की सामग्री के लिए वाइल्डकार्ड का उपयोग किए बिना (जैसे dir/*) चूंकि वाइल्डकार्ड शेल द्वारा विस्तारित है और rsync इस प्रकार व्यक्तिगत फ़ाइलों को स्थानांतरित करने का अनुरोध करता है, न कि फाइलों की मूल निर्देशिका। फ़ाइलों को हस्तांतरण से बाहर रखा गया फ़ाइलों को भी बाहर रखा गया है। हटाए जाने तक आप --delete-excludedविकल्प का उपयोग करते हैं या केवल भेजने वाले पक्ष के मिलान के रूप में नियमों को चिह्नित करते हैं (देखें फ़िल्टर अनुभाग में शामिल / बहिष्कृत संशोधक देखें)। "


यह कार्यात्मक रूप से 2011 से स्वेन के उत्तर के समान है।
रोवन हॉकिन्स

8

यदि आप दूसरी rsync लाइन को rsync -a --delete $DIR1/ $DIR2(* के बिना) बदलते हैं तो यह काम करेगा। कारण यह है कि शेल *पहली निर्देशिका में फ़ाइल नामों तक फैलता है , जो केवल आपके मामले में b है, इसलिए अनुपस्थित फ़ाइल को rsync द्वारा बिल्कुल भी नहीं माना जाएगा, क्योंकि कमांड जो निष्पादित होता है वह वास्तव में है rsync -a --delete $DIR1/b $DIR2

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