rsync, उस पक्ष को प्राप्त करने वाली फ़ाइलों को हटा दें जिन्हें साइड भेजने पर हटा दिया गया था। (लेकिन सब कुछ हटा नहीं)


9

मैं rsync का उपयोग करना चाहूंगा ...

  • डिलीट की गई फाइलों को डिलीट साइड पर डिलीट कर दें
  • अन्य फ़ाइलों को डिलीट न करें जो रिसिनिस्ड डायरेक्टरी में रिसीव करने वाले हैं

उदाहरण के लिए, मान लें कि मेरे पास एक निर्देशिका है local-src:

पहले से: local-src स्थानीय रूप से शामिल है ...

a.txt
b.txt
c.txt

मेरी दूरस्थ निर्देशिका जिसे मैं सामग्री के साथ सिंक करना चाहूंगा उसे local-srcकहा जाता है remote-src

पहले से: remote-src दूर से शामिल हैं ...

a.txt
b.txt
c.txt
d.txt
README.md

मान लीजिए कि मैं कुछ फाइलें हटाता हूं local-src:

स्थानीय भाषा के अनुसार: local-src स्थानीय रूप से ...

c.txt

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

स्थानीय भाषा के अनुसार: remote-src दूरस्थ रूप से सम्‍मिलित ...

c.txt
d.txt
README.md

यही है, a.txtऔर b.txtदूर से भी हटा दिए हैं, लेकिन d.txtऔर README.txtअकेला छोड़ दिया जाता।

क्या rsync के साथ इसे प्राप्त करने का कोई तरीका है?

संपादित करें: निर्णय लगता है कि यह rsync के साथ असंभव हो सकता है। मुझसे पूछा गया कि मुझे इसकी आवश्यकता क्यों है, इसलिए अपने उपयोग-मामले को स्पष्ट करने के लिए:

मान लीजिए कि मेरे पास एक वेब सर्वर है। उस वेब सर्वर पर, मुझे निर्देशिकाओं का एक समूह मिला है, मान लीजिए कि मेरे पास एक निर्देशिका Aऔर एक public_htmlनिर्देशिका है जिसे मेरी साइट से परोसा जाता है। मान लीजिए कि मेरे पास कुछ स्वचालित प्रक्रिया है जो निर्देशिका में फ़ाइलों का उत्पादन करती है A। मैं rsync (या कुछ अन्य टूल का उपयोग करके सिंक) करना चाहता हूं जो निर्देशिका में उत्पन्न या अपडेट की गई फाइलें हैं, जो अन्य मनमानी फाइलों को हटाने के बिना हो सकती हैं । मैं निश्चित रूप से नहीं चाहता कि rsync गलती से मेरी वेबसाइट को हटा दे।Apublic_htmlpublic_html

यदि rsync इस कार्य के लिए उपकरण नहीं है, तो क्या कोई और जानता है कि मैं यह कैसे कर सकता हूं?


2
आपके प्रश्न को फिर से पढ़ने के बाद, मुझे नहीं लगता कि यह संभव है rsyncक्योंकि यह पता करने का कोई तरीका नहीं है कि पहले से ही दूरस्थ फ़ोल्डर में कौन सी फाइलें हैं। आपको किसी अन्य टूल का पता लगाने की आवश्यकता हो सकती है।
Spack

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

1
मुझे लगता है कि आप पहले से ही इस बारे में सोच रहे हैं, लेकिन क्या आप इन फ़ाइलों को एक उपनिर्देशिका (या कहीं और) में नहीं डाल सकते हैं और उन्हें public_html से संदर्भित कर सकते हैं? इस तरह आपके पास एक निर्देशिका है जो आसानी से और स्पष्ट रूप से सिंक की जाती है, बिना वेबसर्वर के फाइल सिस्टम के अन्य हिस्सों की फाइलों को प्रभावित किए बिना।
मैटजेनको

जवाबों:


2

आप जो करना चाहते हैं वह उचित है, लेकिन rsyncइसे अपने दम पर करने का उपयोग करना उचित नहीं है। तो जवाब है नहीं

कारण सरल है: rsyncप्रत्येक निर्देशिका में क्या था इसका कोई इतिहास नहीं है और यह जानने का कोई तरीका नहीं है कि क्या हटाने की आवश्यकता है और क्या नहीं। बिना अतिरिक्त समर्थन के नहीं।

आपको अपने आप से पूछना चाहिए कि आप ऐसा क्यों करना पसंद करते हैं rsyncऔर इसे अधिक स्पष्ट करते हैं। ऐसे अन्य कार्यक्रम हैं जो उपयोग librsync1.soकरते हैं जो अधिक बुद्धिमान हैं।


आराम की कमी के साथ, जिसे आपको rsyncप्रति सेर की जरूरत नहीं है, आप rdiff-backup पर एक नज़र डाल सकते हैं :

mkdir a
touch a/xx
touch a/yy
rdiff-backup a b
ls b 

यह दिखाता है xxऔर में yyहैं b

touch b/zz
rm a/xx
rdiff-backup a b

यह दिखाता है xxऔर में zzहैं brdiff-backupयह भी एक निर्देशिका रखता है rdiff-backup-dataमें bतो आप किसी भी परिवर्तन रोलबैक कर सकते हैं, तो आप का उपयोग कर एक नियमित आधार पर यह शुद्ध करना चाहिए rdiff-backupआदेशों। (उदाहरण लक्ष्य में अतिरिक्त डेटा दिखाने के लिए स्थानीय फ़ाइलों के साथ है, हटाया नहीं जाता है, लेकिन rdiff- बैकअप नेटवर्क पर भी काम करता है)।


एक अन्य विकल्प कुछ वितरित पुनरीक्षण नियंत्रण प्रणाली (व्यापारिक, बाजार, गिट) को सेटअप करना है। मर्क्यूरियल उदाहरण के साथ, आपके पास एक स्क्रिप्ट हो सकती है (मैं इसके लिए एक मेकफाइल का उपयोग करता हूं), जो सर्वर में सभी परिवर्तनों को धकेलता है और फिर वहां से चेक की गई फ़ाइलों का अद्यतन करता है, दूरस्थ सर्वर पर मौजूद किसी भी अतिरिक्त फ़ाइलों को अनदेखा करता है (लेकिन है संशोधन नियंत्रण में नहीं रखा गया है)।

सर्वर पर आप क्या करेंगे:

hg init
hg add file_list_excluding_that_should_not_should_be_deleted_if_not_on_client
hg commit -m "initial setup"

ग्राहक पर:

hg clone ssh://username@server/dir_to_repository

अब यदि आप क्लाइंट पर कोई फ़ाइल हटाते हैं और करते हैं:

hg commit -m "removed file"
ssh username@server "cd dir_to_repository; hg update --clean"

आपकी हटाई गई फ़ाइल सर्वर पर निकाल दी जाती है, लेकिन कोई अन्य डेटा (रिपॉजिटरी में नहीं जोड़ा गया) डिलीट नहीं होता है।


मैं यह स्वीकार कर सकता हूं कि rsync ऐसा नहीं करेगा। लेकिन मैं इस बात से सहमत नहीं हूं कि यह rsync के साथ असंभव होगा- अगर rsync को यह पता चल जाए कि कौन सी फाइलें डिलीट की गई हैं, तो यह उस जानकारी को अलग-अलग पक्ष में क्यों नहीं भेज सकता है? ताजगी की तुलना करने के बाद, मैं यह नहीं देखता कि प्राप्त करने वाला पक्ष केवल उन फ़ाइलों को हटा नहीं सकता है जिन्हें निर्देशिका में बाकी सब को हटाए बिना, अंतर में हटाए जाने का संकेत दिया गया है। निर्देशिका में हर दूसरे (स्रोत पर गायब) निर्दोष फ़ाइल को हटाना मेरे लिए अनुचित है।
हीदर मिलर

किसी भी मामले में, मुझे इसकी आवश्यकता इस प्रकार है। मेरे पास एक निर्देशिका है, चलो इसे कॉल करें A, जहां कुछ प्रक्रिया स्वचालित है, और फाइलें स्वचालित रूप से वहां उत्पन्न होती हैं। मुझे एक वेब सर्वर मिला है, और मुझे वेबसर्वर Aकी public_htmlनिर्देशिका के लिए rsynced होने वाली फ़ाइलों को पसंद आएगा , निश्चित रूप public_htmlसे वेब सर्वर के फ़ोल्डर में और सब कुछ हटाने के बिना । यदि किसी के पास किसी अन्य उपकरण के साथ इसे प्राप्त करने के लिए कोई विचार है, तो यह स्वागत से अधिक होगा। मैं इसे प्रतिबिंबित करने के लिए अपने प्रश्न को अपडेट करूंगा।
हीथर मिलर

ऊपर मेरी पहली टिप्पणी को स्पष्ट करने के लिए- मुझे कहा जाना चाहिए "मैं इस बात से सहमत नहीं हूं कि rsync जैसे उपकरण के साथ ऐसा कुछ असंभव होना चाहिए"। वास्तव में, ऐसा लगता है कि यह हासिल करना बहुत मुश्किल नहीं है (जब तक कि मैं कुछ याद नहीं कर रहा हूं)।
हीदर मिलर

हम्म ठीक है। मुझे लगता है कि मैं अब देख रहा हूं- rsync को कैसे पता चलेगा कि जब local-srcपरिवर्तन के लिए उस निर्देशिका को देखने की कुछ प्रक्रिया के बिना निर्देशिका में कुछ हटा दिया गया था । शायद यह कठिन होगा।
हीदर मिलर

@ हीथरमिलर जैसा मैंने लिखा, आपका अनुरोध उचित है, लेकिन rsyncउपकरण नहीं है। कृपया पता है कि syncमें rsyncसिंक्रनाइज़ किया जा रहा से आता है और कि वास्तव में नहीं है कि आप क्या करना चाहते हैं। rsyncफोकस के विकास में डेटा के हस्तांतरण को कुशल (कम से कम करना) किया गया है। अन्य उपकरणों जैसे rdiff-backup(और संभव cvsup) ने इसके लिए अपनी तकनीकों का उपयोग किया है, लेकिन अतिरिक्त सुविधाओं के साथ इसका निर्माण करते हैं।
एंथन

1

मुझे नहीं लगता कि rsync कमांड के हिस्से के रूप में प्राप्त फ़ाइलों को स्पष्ट रूप से बाहर किए बिना यह संभव है। Rsync के लिए मैन पेज सेक्शन देखें: "पेर-डाइरेक्टरी रूल्स एंड DELETE"।

डिलीट ऑप्शन के बिना, प्रति-निर्देशिका नियम केवल भेजने के पक्ष में प्रासंगिक हैं, इसलिए आप हस्तांतरण को प्रभावित किए बिना मर्ज फ़ाइलों को स्वयं को बाहर करने के लिए स्वतंत्र महसूस कर सकते हैं। इस आसान को बनाने के लिए, 'ई' संशोधक आपके लिए इसे अलग करता है, जैसा कि इन दो समकक्ष आदेशों में देखा गया है:

          rsync -av --filter=': .excl' --exclude=.excl host:src/dir /dest
          rsync -av --filter=':e .excl' host:src/dir /dest

हालाँकि, यदि आप रिसीविंग साइड पर डिलीट करना चाहते हैं और आप चाहते हैं कि कुछ फाइल्स को डिलीट होने से बाहर रखा जाए, तो आपको यह सुनिश्चित करना होगा कि रिसीविंग साइड को पता हो कि कौन सी फाइल को बाहर करना है। सबसे आसान तरीका यह है कि प्रति-निर्देशिका मर्ज फ़ाइलों को हस्तांतरण और उपयोग --delete-after में शामिल किया जाए, क्योंकि इससे यह सुनिश्चित होता है कि प्राप्त करने वाले पक्ष को सभी समान नियम मिलते हैं क्योंकि भेजने से पहले कुछ भी हटाने की कोशिश करता है:

          rsync -avF --delete-after host:src/dir /dest

हालाँकि, यदि मर्ज फ़ाइलें स्थानांतरण का हिस्सा नहीं हैं, तो आपको या तो कुछ वैश्विक बहिष्कृत नियमों (अर्थात कमांड लाइन पर निर्दिष्ट) को निर्दिष्ट करने की आवश्यकता होगी, या आपको अपनी प्रति-निर्देशिका मर्ज फ़ाइलों को बनाए रखने की आवश्यकता होगी। पक्ष प्राप्त करना। पहले का एक उदाहरण यह है (मान लें कि दूरस्थ .rules फ़ाइलें स्वयं को बाहर करती हैं):

   rsync -av --filter=’: .rules’ --filter=’. /my/extra.rules’
      --delete host:src/dir /dest

उपरोक्त उदाहरण में extra.rules फ़ाइल स्थानांतरण के दोनों किनारों को प्रभावित कर सकती है, लेकिन (भेजने वाले पक्ष पर) नियम .rules फ़ाइलों से विलय किए गए नियमों के अधीन हैं क्योंकि वे प्रति-निर्देशिका मर्ज नियम के बाद निर्दिष्ट किए गए थे।

एक अंतिम उदाहरण में, दूरस्थ पक्ष स्थानांतरण से .rsync-फ़िल्टर फ़ाइलों को बाहर कर रहा है, लेकिन हम अपने .rsync-फ़िल्टर फ़ाइलों का उपयोग करना चाहते हैं ताकि यह प्राप्त किया जा सके कि प्राप्त पक्ष पर क्या हटाया गया है। ऐसा करने के लिए, हमें विशेष रूप से प्रति-निर्देशिका मर्ज फ़ाइलों को बाहर करना चाहिए (ताकि वे नष्ट न हों) और फिर स्थानीय फ़ाइलों को नियंत्रित करने के लिए और क्या नहीं हटाया जाना चाहिए। इन आदेशों में से एक की तरह:

       rsync -av --filter=':e /.rsync-filter' --delete \
           host:src/dir /dest
       rsync -avFF --delete host:src/dir /dest

0

अगर मुझे सही ढंग से समझ में आ गया, तो वही --excludeहो सकता है जो आप ढूंढ रहे हैं:

$ ls src dst
dst:
a.txt  b.txt  c.txt  d.txt  README.md

src:
c.txt
$ rsync --update --delete --recursive --exclude="d.txt" --exclude="README.md" src/ dst
$ ls src dst
dst:
c.txt  d.txt  README.md

src:
c.txt

नहीं। मैं उन सभी फाइलों को मैन्युअल रूप से सूचीबद्ध नहीं करना चाहता, जिन्हें मैं बाहर करना चाहता हूं। मैं केवल उन फाइलों को हटाना चाहता हूं, जिन्हें मैंने स्रोत पर हटा दिया है- मुझे स्रोत पर यह पता नहीं होना चाहिए कि गंतव्य में उसी निर्देशिका में अन्य संभावित फाइलें मौजूद हैं।
हीदर मिलर

0

मेरे पास इसके लिए एक उत्तर है। मुझे लगता है कि यह काम करता है। और यह मेरे लिए काम करता है। पहले आपको rsyncस्थानीय फ़ाइलों को दूरस्थ फ़ाइलों के लिए होना चाहिए । फिर स्थानीय पक्ष में सभी फाइलें होती हैं।

sudo rsync -r -a -v --delete /root@xx.xx.xx.xx:/remote_dir/ /local_dir/

अब स्थानीय पक्ष में

a.txt
b.txt
c.txt
d.txt
README.md

फिर आप फ़ाइलों को हटा सकते हैं या आप जो चाहें कर सकते हैं। (स्थानीय पक्ष में)। अपने प्रश्न में, आप इन फ़ाइलों को हटाते हैं।

हटाई गई फ़ाइलें

a.txt
b.txt

उसके बाद आप rsyncरिमोट साइड में लोकल फाइल कर सकते हैं । फिर दोनों साइड में एक ही फाइल होती है।

sudo rsync -r -a -v --delete /local_dir/ root@xx.xx.xx.xx:/remote_dir/

यह देता है

c.txt
d.txt
README.md

दूरस्थ पक्ष और स्थानीय पक्ष में फ़ाइलें। (उपयोग करके --delete, यह दूरस्थ पक्ष की अन्य फ़ाइलों को हटा देता है जो स्थानीय पक्ष के साथ मेल नहीं खाती हैं )।

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