फ़ाइलों की केवल एक विशिष्ट सूची rsync कैसे करें?


95

मेरे पास विभिन्न उप-निर्देशिकाओं में लगभग 50 या इतनी फाइलें हैं जिन्हें मैं दूरस्थ सर्वर पर धकेलना चाहता हूं। मुझे लगा कि rsync --include-from विकल्प का उपयोग करके मेरे लिए यह करने में सक्षम होगा। --Exclude = "*" विकल्प के बिना, निर्देशिका में सभी फाइलें सिंक की जा रही हैं, विकल्प के साथ, कोई फाइल नहीं है।

rsync -avP -e ssh --include-from=deploy/rsync_include.txt --exclude=* ./ root@0.0.0.0:/var/www/ --dry-run

मैं इसे शुरू में सूखा के रूप में चला रहा हूं और 0.0.0.0 स्पष्ट रूप से दूरस्थ सर्वर के आईपी द्वारा प्रतिस्थापित किया गया है। Rsync_include.txt की सामग्री उन फ़ाइलों के सापेक्ष पथ की एक नई पंक्ति अलग सूची है, जिन्हें मैं अपलोड करना चाहता हूं।

क्या ऐसा करने का एक बेहतर तरीका है जो मुझे सोमवार सुबह से बच रहा है?

जवाबों:


3

संपादित करें: नीचे जोस रोडिन का उत्तर बेहतर है। कृपया उस एक का उपयोग करें!

आपके पास एक आसान समय हो सकता है, यदि आप फ़ाइलों की एक विशिष्ट सूची की तलाश कर रहे हैं, तो उन्हें सीधे कमांड लाइन पर रखें:

# rsync -avP -e ssh `cat deploy/rsync_include.txt` root@0.0.0.0:/var/www/

हालांकि, यह माना जाता है कि आपकी सूची इतनी लंबी नहीं है कि कमांड लाइन की लंबाई एक समस्या होगी और rsync_include.txtफ़ाइल में केवल वास्तविक पथ (यानी कोई टिप्पणी नहीं है, और कोई regexps) नहीं है।


9
दुर्भाग्य से, यह एक बड़ी सूची के साथ या नाम में रिक्त स्थान वाली फ़ाइलों के साथ काम नहीं करता है।
वेस मोड्स

3
[तर्क सूची बहुत लंबी है]
डेंको दाविद

डिफ़ॉल्ट रूप से, xargs तर्कों से कमांड लाइन के अंत में तर्क प्रस्तुत करता है। यह काम नहीं करता क्योंकि rsync को गंतव्य होने के लिए अंतिम तर्क की आवश्यकता होती है। Xargs के कुछ संस्करण वैकल्पिक रूप से इसके बजाय कमांड लाइन के मध्य में तर्क सम्मिलित कर सकते हैं। यह तब तक काम करना चाहिए जब तक आपको इस बात का बुरा न लगे कि फाइलों की सूची लंबी होने पर यह एक से अधिक बार rsync चला सकता है। किसी भी मामले में, rsync --files-fromशायद एक आसान और अधिक विश्वसनीय समाधान है :)
लस्सी

वेस हार्डेकर: क्या आपका एडिट और "जोसिप रॉडिन का जवाब" का संदर्भ वास्तव में @atp का जवाब है जो रोडिन ने संपादित किया है?
सीमस

234

एक झंडा है --files-fromजो वास्तव में आप क्या चाहते हैं। से man rsync:

--files-from=FILE

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

  • - -relative (-R) विकल्प निहित है, जो पथ जानकारी को संरक्षित करता है जो फ़ाइल में प्रत्येक आइटम के लिए निर्दिष्ट है (यदि आप बंद करना चाहते हैं - -no- सापेक्ष या-no-R का उपयोग करें)।

  • --Dirs (-d) विकल्प निहित है, जो कि गंतव्य पर सूची में निर्दिष्ट निर्देशिकाओं के बजाय उन्हें लंघन करने का उपयोग करेगा (यदि आप बंद करना चाहते हैं तो -no-dirs या -no-d का उपयोग करें)।

  • --Archive (-a) विकल्प का व्यवहार impre --recursive (-r) नहीं है, इसलिए यदि आप चाहें तो इसे स्पष्ट रूप से निर्दिष्ट करें।

  • ये साइड-इफेक्ट rsync की डिफ़ॉल्ट स्थिति को बदलते हैं, इसलिए कमांड लाइन पर --files से विकल्प की स्थिति पर कोई असर नहीं पड़ता है कि कैसे अन्य विकल्पों को पार्स किया जाता है (जैसे -a काम करता है --files- से पहले या बाद में से, जैसा कि - कोई-आर और अन्य सभी विकल्प नहीं है)।

फ़ाइल नाम जो FILE से पढ़े जाते हैं, वे सभी स्रोत dir के सापेक्ष हैं - किसी भी प्रमुख स्लैश को हटा दिया जाता है और नहीं ".." संदर्भों को स्रोत dir से अधिक जाने दिया जाता है। उदाहरण के लिए, यह कमांड लें:

rsync -a --files-from=/tmp/foo /usr remote:/backup

यदि / tmp / foo में स्ट्रिंग "बिन" (या यहां तक ​​कि "/ बिन") शामिल है, तो / usr / bin निर्देशिका को दूरस्थ होस्ट पर / backup / bin के रूप में बनाया जाएगा। यदि इसमें "बिन /" (अनुगामी स्लैश पर ध्यान दें), निर्देशिका की तात्कालिक सामग्री भी भेजी जाएगी (फाइल में स्पष्ट रूप से उल्लेख किए बिना - यह संस्करण 2.6.4 में शुरू हुआ)। दोनों स्थितियों में, अगर -r विकल्प को सक्षम किया गया था, तो dir की संपूर्ण पदानुक्रम भी स्थानांतरित हो जाएगी (ध्यान रखें कि -r को स्पष्ट रूप से --files से के साथ निर्दिष्ट करने की आवश्यकता है, क्योंकि यह -a द्वारा निहित नहीं है)। यह भी ध्यान दें कि (डिफ़ॉल्ट रूप से सक्षम) --relative विकल्प का प्रभाव केवल उस पथ की जानकारी को डुप्लिकेट करना है जो फ़ाइल से पढ़ी गई है - यह स्रोत-विशेष पथ के दोहराव को बाध्य नहीं करता है (/ इस मामले में usr) ।

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

rsync -a --files-from=:/path/file-list src:/ /tmp/copy

यह / "पथ / फ़ाइल-सूची फ़ाइल में निर्दिष्ट सभी फ़ाइलों की प्रतिलिपि करेगा जो दूरस्थ" src "होस्ट पर स्थित था।

यदि --iconvv और --protect-args विकल्प निर्दिष्ट किए गए हैं और --files- से फ़ाइलनाम एक होस्ट से दूसरे होस्ट में भेजे जा रहे हैं, तो फ़ाइलनाम को भेजने वाले होस्ट के चारसेट से प्राप्त होस्ट के charset में अनुवादित किया जाएगा।

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


23
ध्यान दें कि आपको अभी भी उस निर्देशिका को निर्दिष्ट करना है जहाँ सूचीबद्ध फ़ाइलें स्थित हैं, उदाहरण के लिए: rsync -av --files-from=file-list . target/वर्तमान dir से फ़ाइलों की प्रतिलिपि बनाने के लिए।
निकोलस मटिया

7
हाँ, और फिर से दोहराना The filenames that are read from the FILE are all relative to the source dir:।
atp

आह, वह चूक गया, क्षमा करें!
निकोलस मटिया

1
अगर फ़ाइल से फ़ाइल में कुछ भी है जो ..rsync से शुरू होता है, तो ..मुझे एक त्रुटि देने की उपेक्षा करता प्रतीत होता है, जैसे rsync: link_stat "/home/michael/test/subdir/test.txt" failed: No such file or directory(इस मामले में "परीक्षण" dir से चल रहा है और निर्दिष्ट करने की कोशिश कर रहा है "../subdir/test.txt" जो मौजूद है।
माइकल

क्या --files-fromतर्क में शामिल और बहिष्कृत की एक स्पष्ट सूची के साथ जोड़ा जा सकता है, और क्या सूची से फ़ाइलें --files-fromमौजूदा बहिष्कृत नियमों के साथ जोड़ दी जाएंगी , जैसे कि यदि वे फ़ाइल में दिखाई देती हैं तो वे शामिल हैं?
हाईस्किगुई

13

--files-from=यदि आप पूर्ण पथ को अक्षुण्ण रखना चाहते हैं, तो पैरामीटर को स्लेश की आवश्यकता है। तो आपका आदेश नीचे जैसा कुछ बन जाएगा:

rsync -av --files-from=/path/to/file / /tmp/

यह किया जा सकता है जैसे बड़ी संख्या में फाइलें हैं और आप सभी फाइलों को x पथ पर कॉपी करना चाहते हैं। तो आपको फाइलें मिलेंगी और आउटपुट को नीचे दी गई फाइल की तरह फेंक देगी:

find /var/* -name *.log > file

9

रिकॉर्ड के लिए, ऊपर दिए गए उत्तरों में से कोई भी एक को छोड़कर मदद नहीं करता है। संक्षेप में, आप बैकअप ऑपरेशन का उपयोग कर सकते हैं--files-from= या तो उपयोग :

 rsync -Svuc `बिल्ली rsync-src-files` / mnt / d / rsync_test/

या

rsync -aSvuc --recursive --files-from = rsync-src-files। / MNT / घ / rsync_test /

पूर्व कमांड फ़ाइल की सामग्री के बगल में स्व व्याख्यात्मक है, rsync-src-filesजिसे मैं नीचे विस्तार से बताऊंगा। अब, यदि आप बाद वाले संस्करण का उपयोग करना चाहते हैं, तो आपको निम्नलिखित चार टिप्पणियों को ध्यान में रखना होगा:

  1. एक --files-fromऔर स्रोत निर्देशिका दोनों को निर्दिष्ट करने की आवश्यकता पर ध्यान दें
  2. एक को स्पष्ट रूप से निर्दिष्ट करने की आवश्यकता है --recursive
  3. फ़ाइल rsync-src-filesएक उपयोगकर्ता द्वारा बनाई गई फ़ाइल है और इसे इस परीक्षण के लिए src निर्देशिका में रखा गया था
  4. rsyn-src-filesनकल करने के लिए फ़ाइलों और फ़ोल्डरों होते हैं और वे स्रोत निर्देशिका के सापेक्ष लिया जाता है। महत्वपूर्ण: सुनिश्चित करें कि फ़ाइल में रिक्त स्थान या रिक्त लाइनें नहीं हैं। नीचे दिए गए उदाहरण में, केवल दो रेखाएं हैं, तीन नहीं (चित्रा इसे संयोग से देखें)। की सामग्री rsynch-src-filesहै:

folderName1
folderName2


3

मुझे समान कार्य मिला: दी गई तिथि के बाद संशोधित की गई सभी फाइलों को rsync करने के लिए, लेकिन कुछ निर्देशिकाओं को छोड़कर। एक लाइनर ऑल-इन-वन शैली का निर्माण करना मुश्किल था, इसलिए मैंने समस्या को छोटे टुकड़ों में बदल दिया। अंतिम समाधान:

find  ~/sourceDIR -type f -newermt "DD MMM YYYY HH:MM:SS" | egrep -v "/\..|Downloads|FOO" > FileList.txt
rsync -v --files-from=FileList.txt ~/sourceDIR /Destination

पहले मैं उपयोग करता हूं find -L ~/sourceDIR -type f -newermt "DD MMM YYYY HH:MM:SS"। मैंने नाम पैटर्न को बाहर करने के regexलिए findलाइन में जोड़ने की कोशिश की , हालांकि लिनक्स (मिंट) सीम का मेरा स्वाद नकारात्मक रीगेक्स को समझने में नहीं find। रेगेक्स फ्लेवर्स की संख्या - वांछित के रूप में गैर काम। इसलिए मैं egrep -vउस विकल्प को समाप्त करता हूं जो पैटर्न को आसान तरीके से बाहर करता है। मेरी rsyncनिर्देशिका की तरह नकल नहीं है कैश या /.कॉन्फिग प्लस और कुछ अन्य को मैं स्पष्ट रूप से नाम नहीं दे रहा हूं।


1
मेरा मानना ​​है कि आप इसे bashएक-लाइनर में बदलने के लिए प्रक्रिया प्रतिस्थापन का उपयोग कर सकते हैं :rsync -v --files-from=<(find ~/sourceDIR -type f -newermt "DD MMM YYYY HH:MM:SS" | grep -Ev "/\..|Downloads|FOO") ~/sourceDIR /Destination
phk

2
$ date
  Wed 24 Apr 2019 09:54:53 AM PDT
$ rsync --version
  rsync  version 3.1.3  protocol version 31
  ...

वाक्य - विन्यास: rsync <file_/_folder_list> <source> <target>

फ़ोल्डर के नाम (यहां, अनुगामी के साथ /; उदाहरण के लिए;Cancer - Evolution/ ) एक फ़ोल्डर सूची फ़ाइल में हैं (उदाहरण: cm_folder_list_estestest):

# /mnt/Vancouver/projects/ie/claws/data/cm_folder_list_test
# test file: 2019-04-24
Cancer/
Cancer - Evolution/
Cancer - Genomic Variants/
Cancer - Metastasis (EMT Transition ...)/
Cancer Pathways, Networks/
Catabolism - Autophagy; Phagosomes; Mitophagy/
Catabolism - Lysosomes/

यदि आप उन अनुगामी को शामिल नहीं करते हैं / , तो rsync'd लक्ष्य फ़ोल्डर बनाए जाते हैं, लेकिन खाली हैं।

उन फ़ोल्डर नामों को उनके शेष पथ से जोड़ दिया जाता है (/home/victoria/Mail/2_RESEARCH - NEWS ), इस प्रकार पूरा फ़ोल्डर पथ rsync को प्रदान करता है; उदाहरण के लिए: /home/victoria/Mail/2_RESEARCH - NEWS/Cancer - Evolution/

ध्यान दें कि आपको उपयोग करने की आवश्यकता है --files-from=..., नहीं --include-from=...

rsync -aqP --delete --files-from=/mnt/Vancouver/projects/ie/claws/data/cm_folder_list_test "/home/victoria/Mail/2_RESEARCH - NEWS" $IN/

(मेरी BASH स्क्रिप्ट में, मैंने वेरिएबल $INको निम्नानुसार परिभाषित किया है।)

BASEDIR="/mnt/Vancouver/projects/ie/claws"
IN=$BASEDIR/data/test/input

rsync विकल्प का उपयोग किया जाता है:

 -a  :   archive: equals -rlptgoD (no -H,-A,-X)
    -r  :   recursive
    -l  :   copy symlinks as symlinks
    -p  :   preserve permissions
    -t  :   preserve modification times 
    -g  :   preserve group 
    -o  :   preserve owner (super-user only) 
    -D  :   same as --devices --specials 
  -q  :   quiet (/server/547106/run-totally-silent-rsync)

  --delete
    This  tells  rsync to delete extraneous files from the RECEIVING SIDE (ones
    that AREN’T ON THE SENDING SIDE), but only for the directories that are
    being synchronized.  You must have asked rsync to send the whole directory
    (e.g.  "dir" or "dir/") without using a wildcard for the directory’s contents
    (e.g. "dir/*") since the wildcard is expanded by the shell and rsync thus
    gets a request to transfer individual files, not the files’ parent directory.
    Files  that  are  excluded  from  the transfer are also excluded from being
    deleted unless you use the --delete-excluded option or mark the rules as
    only matching on the sending side (see the include/exclude modifiers in the
    FILTER RULES section).  ...

1

यह उत्तर प्रश्न का सीधा उत्तर नहीं है। लेकिन इससे आपको यह पता लगाने में मदद मिलेगी कि आपकी समस्या के लिए कौन सा समाधान सबसे उपयुक्त है।

समस्या का विश्लेषण करते समय आपको डिबग विकल्प को सक्रिय करना चाहिए -vv

फिर rsync आउटपुट करेगा कि कौन सी फाइलें शामिल हैं या किस पैटर्न से बाहर रखी गई हैं:

building file list ... 
[sender] hiding file FILE1 because of pattern FILE1*
[sender] showing file FILE2 because of pattern *

0

इन उत्तरों में से कोई भी मेरे लिए काम नहीं करता था, जब मेरे पास सभी निर्देशिकाओं की एक सूची थी । फिर मैं समाधान पर ठोकर खाई! आप जोड़ने के लिए -rकरने के लिए --files-from, क्योंकि -aइस परिदृश्य (जो जानता था ?!) में पुनरावर्ती नहीं होगा।

rsync -aruRP --files-from=directory.list . ../new/location

यदि आप फ़ाइल में "dir" सूचीबद्ध करते हैं, तो आपको निर्दिष्ट करना होगा -r / -recursive; यदि आप सूची "dir /" आप नहीं करते हैं।
lbutlr
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.