क्या मैं केवल परिवर्तित फ़ाइलों की सूची बनाने के लिए rsync का उपयोग कर सकता हूं?


26

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

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

क्या किसी को इस तरह के कार्य करने का एक तरीका मिला है?

# specify the source directory
source_directory=/Users/jason/Desktop/source

# specify the destination directory
# DO NOT ADD THE SAME DIRECTORY NAME AS RSYNC WILL CREATE IT FOR YOU
destination_directory=/Users/jason/Desktop/destination

# run the rsync command
rsync -avz $source_directory $destination_directory

# grab the changed items and save to an array or temp file?

# loop through and chown each changed file
for changed_item in "${changed_items[@]}"
do
        # chown the file owner and notify the user
        chown -R user:usergroup; echo '!! changed the user and group for:' $changed_item
done

यहाँ मेरे awer देखें । -iआइटम के लिए भी , लेकिन कुछ और ट्विस्ट के साथ ...
फ्रैंक नॉक

जवाबों:


42

आप पार्सबल आउटपुट उत्पन्न करने के लिए rsync --itemize-changes( -i) विकल्प का उपयोग कर सकते हैं जो इस तरह दिखता है:

~ $ rsync src/ dest/ -ai
.d..t.... ./
>f+++++++ newfile
>f..t.... oldfile

~ $ echo 'new stuff' > src/newfile

~ $ !rsync
rsync src/ dest/ -ai
>f.st.... newfile

>पहली स्थिति में चरित्र को इंगित करता है एक फ़ाइल अद्यतन किया गया था, शेष वर्ण क्यों, उदाहरण के लिए यहां से संकेत मिलता है sऔर tसंकेत मिलता है कि फ़ाइल आकार और टाइमस्टैम्प बदल दिया है।

फ़ाइल सूची प्राप्त करने का एक त्वरित और गंदा तरीका हो सकता है:

rsync -ai src/ dest/ | egrep '^>'

जाहिर है अधिक उन्नत पार्सिंग क्लीनर उत्पादन का उत्पादन कर सकता है :-)

जब --itemize-changesयह शुरू किया गया था, तो यह पता लगाने की कोशिश करते हुए मैं इस बेहतरीन लिंक पर आया था कि यह बहुत उपयोगी है:

http://andreafrancia.it/2010/03/understanding-the-output-of-rsync-itemize-changes.html (संग्रहीत लिंक)


2
उल्लेख के अनुसार एक क्लीनर आउटपुट के लिए, rsync -zaic src/ dest/ | grep '^?c' | cut -d' ' -f2 --dry-runकेवल संशोधित फ़ाइलों ( अलग-अलग चेकसम ) को सूचीबद्ध करेगा , निश्चित रूप से एक कीपर, thx :) FYI करें --dry-run, कमांड का उपयोग करने के बजाय nविकल्प का उपयोग करना मेरे लिए सबसे अच्छा अभ्यास है
MediaVince

अनिवार्य रूप से rsync -zavc src/ dest/ --dry-run
क्रिया के

14

चेकसम ध्वज और ध्वज -nके साथ संयुक्त ध्वज का उपयोग करें :-c-i

# rsync -naic test/ test-clone/
>fcst...... a.txt
>fcst...... abcde.txt
>fcst...... b.txt

इस उदाहरण में, फ़ाइल की सामग्री के आधार पर केवल एक फ़ाइल बदल गई है। हालाँकि, -nध्वज के कारण कोई फ़ाइल सिंकिंग नहीं की जाती है

बोनस

यदि आप बदली गई फ़ाइलों पर चाउन चलाना चाहते हैं, तो उन्हें sedया तो समान के साथ पार्स करें और xargs के साथ प्रक्रिया करें, उदाहरण के लिए:

rsync -naic test/ test-clone/ | sed 's/............//' | xargs -I+ sudo chown root "test-clone/+"

3
sed->cut -d ' ' -f2,-
MUY बेल्जियम

-n --dry-run, -c --checksum,-i --itemize-changes
ThorSummoner

मैं पीछा नहीं कर रहा हूँ। उदाहरण में उन सभी फाइलों को '> fcst' के रूप में चिह्नित किया गया है, जिन्हें मैं समझता हूं कि 'दूरस्थ से प्राप्त किया जा रहा है', चेकसम भिन्न होता है, आकार भिन्न होता है, समय भिन्न होता है। आउटपुट में क्या इंगित करता है कि "केवल एक फ़ाइल बदल गई है" ??
बोबपॉल

1

यह सवाल थोड़ा पुराना है, लेकिन मुझे लगता है कि इसे जोड़ा जाना चाहिए:

-i का शॉर्टकट है --out-format=%i%n%L

और %nसाधन फ़ाइल नाम, (अनुभाग log formatका man rsyncd.conf)

PS rsync संस्करण 3.1.0


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