पुनरावर्ती रूप से dir की प्रतिलिपि बनाने के लिए scp का उपयोग करते समय फ़ाइलों को कैसे फ़िल्टर करें?


99

मुझे सभी डीआरआर के साथ सर्वर से स्थानीय तक सभी .class फ़ाइलों को कॉपी करने की आवश्यकता है। उदाहरण के लिए समस्या यह server:/usr/some/unknown/number/of/sub/folders/me.classहोगी कि /usr/project/backup/some/unknown/number/of/sub/folders/me.classकई अन्य बेकार फाइलें हैं जैसे कि .svn- बेस फाइलें जो मुझे नहीं चाहिए। मैं उन्हें कैसे फ़िल्टर कर सकता हूं इसलिए मैं केवल scp.class फ़ाइलें?


मुझे उल्लिखित rsync विकल्प पसंद है। आपने उल्लेख नहीं किया कि क्या यह एक बार बंद होने वाला ऑपरेशन है, या यदि आप इसे बार-बार स्वचालित करेंगे। एक बार के ऑपरेशन के लिए, खोज, grep -v, xargs और अस्थायी फ़ाइलों के विवेकपूर्ण उपयोग को इस का छोटा काम करना चाहिए।
user47559

जवाबों:


152

मैं शायद rsyncइसके includeऔर excludeझंडे के कारण इसके लिए कुछ उपयोग करने की सलाह दूंगा, जैसे: -

rsync -rav -e ssh --include '*/' --include='*.class' --exclude='*' \
server:/usr/some/unknown/number/of/sub/folders/ \ 
/usr/project/backup/some/unknown/number/of/sub/folders/

कुछ अन्य उपयोगी झंडे:

  • -r पुनरावर्ती के लिए
  • -a संग्रह के लिए (ज्यादातर सभी फाइलें)
  • -v क्रिया आउटपुट के लिए
  • -e डिफ़ॉल्ट के बजाय ssh निर्दिष्ट करने के लिए (जो ssh होना चाहिए, वास्तव में)

4
वैसे भी इस सबफ़ोल्डर्स को अनदेखा करने के लिए जिनके पास * क्लास फाइलें नहीं हैं? (यानी मुझे खाली डायरियों का एक गुच्छा नहीं चाहिए)
ग्रांट बिर्चमियर

भयानक, और यह भी तेजी से दुष्ट है!
प्रसाद चालसानी

2
क्या आप समझा सकते हैं --include, not --include = MAN पृष्ठों में, मैं
--include

1
विकल्प -aपहले -rसे ही rsync मैन पेज के अनुसार शामिल है ।
जॉर्ज शॉर्ली

3
@GrantBirchmeier --prune-empty-dirsखाली dirs को हटा देगा।
एल्रोन्ड 1337

75

बेस डायरेक्टरी में डॉटफाइल्स को बाहर करने के लिए:

scp -r [!.]* server:/path/to/something

[!.]* एक शेल ग्लोब है जो कार्यशील निर्देशिका में सभी फाइलों को एक डॉट के साथ शुरू नहीं करने के लिए फैलता है।


10
यह शायद सबसे अच्छा जवाब है; फ़ाइलों को फ़िल्टर करने के लिए ग्लब्स का उपयोग करने का तरीका है।
योशुआ वुइट्स

1
यदि आपका विकल्प मेरे जैसे scp तक ही सीमित है, तो इससे निश्चित रूप से मदद मिली है।
user28095

3
यह पूछा जा रहा है जैसे फ़ाइलों को बाहर करने के लिए इंगित करता है, लेकिन यह पूरी निर्देशिका के लिए कैसे प्राप्त किया जा सकता है?
पिल

Zsh के लिए:scp -r [\!.]* server:/path/to/something
माइकल बार-सिनाई

37

फ़ाइलों को फ़िल्टर करने के लिए scp में कोई सुविधा नहीं है। इस तरह "उन्नत" सामान के लिए, मैं rsync का उपयोग करने की सलाह देता हूं:

rsync -av --exclude '*.svn' user@server:/my/dir .

(यह लाइन कॉपी rsync दूर फ़ोल्डर से वर्तमान एक तक)

डिफ़ॉल्ट रूप से स्वचालित रूप से ssh कनेक्शन पर rsync सुरंग के हाल के संस्करण।


10

चूँकि आप निम्न के scpलिए ठीक हो सकते हैं ssh,
या तो स्क्रिप्ट को निम्नलिखित या लॉगिन करें और निष्पादित करें ...

# After reaching the server of interest
cd /usr/some/unknown/number/of/sub/folders
tar cfj pack.tar.bz2 $(find . -type f -name *.class)

(लॉग आउट) वापस लौटने स्थानीय सर्वर और scp,

# from the local machine
cd /usr/project/backup/some/unknown/number/of/sub/folders
scp you@server:/usr/some/unknown/number/of/sub/folders/pack.tar.bz2 .
tar xfj pack.tar.bz2

यदि आप पाते हैं कि $(find ...)आपके टार परिवर्तन के लिए बहुत लंबा है,

find . -type f -name *.class | xargs tar cfj pack.tar.bz2

अंत में, जब से आप इसे रख रहे हैं /usr/project/backup/,
निकासी को क्यों परेशान करते हैं? बस tar.bz2, शायद एक तारीख + समय टिकट के साथ रखें।


इससे मुझे मदद मिली। मैं विंडोज में हूं rsyncऔर sshओएस पर स्थापित होने की कोशिश कर रहा हूं । इसके बजाय, यह एक चतुर समाधान था। धन्यवाद!
रेविन्गेंग

2

फ़ाइलों के लिए नीचे आदेश।

scp `खोजो। -maxdepth 1 -name "* .log" \! -name "hs_err_pid2801.log" -type f` root @ IP: / tmp / test /

  1. आईपी ​​गंतव्य सर्वर आईपी पता होगा।
  2. फ़ाइलों को शामिल करने के लिए "*" .log "।
  3. \! फ़ाइलों को बाहर करने के लिए -name "hs_err_pid2801.log"।
  4. । वर्तमान काम कर रहा है।
  5. फ़ाइल प्रकार के लिए टाइप करें।

निर्देशिका के लिए नीचे कमांड।

scp -r `find। -Maxdepth 1 -नाम "लो *" \! -नाम "लोकलहोस्ट" -टाइप d` रूट @ आईपी: / tmp / परीक्षण /

आप अपनी आवश्यकता के अनुसार कमांड के ऊपर अनुकूलित कर सकते हैं।


1

Ssh कुंजी आधारित प्रमाणीकरण सक्षम होने के बाद, निम्न स्क्रिप्ट काम करेगी।

for x in `ssh user@remotehost 'find /usr/some -type f -name *.class'`; do y=$(echo $x|sed 's/.[^/]*$//'|sed "s/^\/usr//"); mkdir -p /usr/project/backup$y; scp $(echo 'user@remotehost:'$x) /usr/project/backup$y/; done

1

यदि आप वास्तव में scp का उपयोग करना चाहते हैं, तो एक अप्रत्यक्ष तरीका है। फिर भी हम सभी .jpg फ़ाइल को स्थानीय फ़ोल्डर '/ src' के अंतर्गत फ़ोल्डर '/ dst' में दूरस्थ सर्वर 10.1.1.2 पर कॉपी करना चाहते हैं:

#make a clean temp folder
mkdir /tmp/ttt
#copy all .jpg file and retain folder structure as-is
find /src -type f -name *.jpg -exec cp --parents \{\} /tmp/ttt \;
#copy to remote target folder as-is and retain original time attributes
scp -rp /tmp/ttt/* 10.1.1.2:/dst
#if copy ok, remove temp folder
rm -rf /tmp/ttt

0
scp -i /home/<user>/.ssh/id_rsa -o "StrictHostKeyChecking=no" -rp /source/directory/path/[!.]* <target_user>@<target_system:/destination/directory/path

1
मौखिक स्पष्टीकरण भी साथ कोड के साथ सहायक होते हैं
चोर

-1
  1. अपना स्रोत फ़ोल्डर कॉपी करें somedir:

    सी पि आर srcdir somedir

  2. सभी अनावश्यक फ़ाइलें निकालें:

    somedir -name '.svn' -exec rm -rf {} \ + खोजें

  3. से लॉन्च scp somedir


इस उत्तर पर सभी डाउनवोट क्यों? यह सवाल के समाधान के माध्यम से लगता है।
बकरोल

7
क्योंकि यह अनावश्यक फ़ाइलों का एक गुच्छा कॉपी करेगा और फिर उन्हें नष्ट कर देगा, संभावित रूप से बहुत समय बर्बाद कर देगा।
ऊद

कई संकलन चरणों से गुजरने वाले कार्यक्रम के लिए, यह वास्तव में बहुत मायने रखता है। यह सही कदम है कि एक में संकलित कोड पैक से पहले जा सकते हैं tarया zip-file। इसके बजाय, कोई संपीड़न नहीं है (एससीपी संपीड़न करता है) और 'पैकेज्ड' कोड को कॉपी किया जाता है।
संवत २४'१६ को १v

यह सच है कि @samvv (सभी सेटअप, पर्यावरण पर निर्भर करता है)
सैन जे फाल्कन

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