एक साथ कई गंतव्यों के लिए कई स्रोतों की प्रतिलिपि बनाएँ


2

मान लीजिए मुझे फ़ाइलों की प्रतिलिपि बनाने की आवश्यकता है

~/path/to/file सेवा user@remote:/path/to/file

~/path/to/another/file सेवा user@remote:/path/to/another/file

~/path/alternative सेवा user@remote:/path/alternative

क्या इसका उपयोग करने का एक तरीका है rsyncया scp?

मैंने कोशिश की rsync ~/path/{to/file,to/another/file,alternative} user@remote:/path

लेकिन यह एक विकल्प नहीं है अगर मुझे किसी अन्य भाग्य की तरह कॉपी करने की आवश्यकता है another_path

यदि मुझे कम से कम 20 फ़ाइलों की प्रतिलिपि बनाने की आवश्यकता है, तो फ़ाइल-दर-फ़ाइल कॉपी करना बहुत लंबा है।


यदि आप पूरी सामग्री को स्थानांतरित नहीं करना चाहते हैं ~/path/तो आपको rsync का --files-fromविकल्प देखना चाहिए ।
वार्टेल

@ वर्टल, यह वास्तव में समस्या का अब तक का सबसे अच्छा निर्णय है। यदि आप प्रश्न का उत्तर देते हैं, तो मैं स्वीकार करूंगा।
नेमोडेन

जवाबों:


1

यदि आप rsync के माध्यम से फ़ाइलों के चयन को स्थानांतरित करना चाहते हैं, अर्थात सामग्री सहित पूरी निर्देशिका नहीं है, तो ऐसा करने का सबसे अच्छा तरीका rsync के --files-fromविकल्प का उपयोग करके है । आपके द्वारा निर्दिष्ट स्रोत निर्देशिका के सापेक्ष आप जिन फ़ाइलों को स्थानांतरित करना चाहते हैं, उनके पाथनाम रखें। अधिक विस्तृत जानकारी के लिए rsync का मैनपेज देखें।


0

यह स्क्रिप्ट शेल बैकग्राउंड जॉब्स के उपयोग के माध्यम से , समान रूप से , होस्ट की एक मनमानी संख्या में, इनपुट निर्देशिकाओं की एक अनियंत्रित संख्या की नकल करेगी । यहाँ मैंने cpio का उपयोग किया है क्योंकि इनपुट फ़ाइलों को विभाजित और पाइप करना आसान है, लेकिन आप इसे rsync --files-fromभी उपयोग करने के लिए संशोधित कर सकते हैं।

उपयोग: multi-cpio.sh <srcfile> <dstfile> (गैर-संवादात्मक लॉगिन के लिए ssh- कुंजियों की आवश्यकता है)

srcfile प्रति पंक्ति एक निर्देशिका होती है, जैसे:

/usr/share/man/man1
/usr/share/man/man3
/usr/share/man/man5

dstfile प्रति पंक्ति एक दूरस्थ लक्ष्य होता है, जैसे:

user@host:/tmp/a
user@host:/tmp/b
user@host:/tmp/c

... और इसके लिए स्रोत multi-cpio.sh:

#!/bin/bash 

SRCLIST=$1
DSTLIST=$2

# create temporary files, safely, in /tmp with mcpio prefix
TEMP=`tempfile -p mcpio`

# loop over input file and create a list of all files to be copied
for I in `cat $SRCLIST` ; do
  find $I -depth -print >>$TEMP
done

# split the file into CPU count + factor
# set to '4' here, seems like ~6x CPIO will max my 1Gb Ethernet link to ~800Mbps in atop
SPLITCOUNT= $(( $( wc -l $TEMP | cut -d' ' -f1) / $(( $( grep processor /proc/cpuinfo | wc -l ) + 4 )) ))
split -l $SPLITCOUNT $TEMP $TEMP 


# nested loops, for each target and for each chunk, start a background copy


for DEST in `cat $DSTLIST` ; do
  # this selects the "user@host" from user@host:/target/path
  HOST=$(expr substr $DEST 1 $(($(expr index $DEST :)-1)))
  # this selects the "/target/path" from user@host:/target/path
  DIR=$(expr substr $DEST $(($(expr index $DEST :)+1)) $(expr length $DEST))

  # loop over all the split tempfiles with ${TEMP}??
  for I in ${TEMP}?? ; do
   # use cpio in copy-out mode to stream the files through ssh
   # then ensure the target is in place in the remote host, cd into it,
   # and copy-in the files.
   # note the '&' at the end backgrounds this command, so the loop
   # will continue and generate more concurrent background jobs
   cat $I | cpio -o | ssh $HOST \
     "mkdir $DIR ; cd $DIR && cpio -idum --no-absolute-filenames" & 
   # sleep for a second before the next spawn to allow for ssh auth
   #  and so sshd doesn't start dropping new sessions
   sleep 1
  done
done

# cleanup the tempfiles
rm ${TEMP}??
rm $TEMP

अतिरिक्त cpio संदर्भ और इस स्क्रिप्ट की प्रेरणा के लिए http://rightsock.com/~kjw/Ramblings/tar_v_cpio.html भी देखें ।

संपादित करें: केवल एक src dst के लिए वैकल्पिक सिंटैक्स, srcfile डेस्टाइल बनाने के बिना:

multi-cpio.sh <(echo "/path/to/src") <(echo "user@host:/path/to/dest")
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.