नियमित अभिव्यक्ति के साथ कैसे स्केप करें


13

मैं उन सभी फाइलों को कॉपी करने की कोशिश कर रहा हूं जो ksh में "a" अक्षर से शुरू नहीं होती हैं।

स्रोत मशीन से गंतव्य मशीन पर प्रतिलिपि बनाना ठीक काम कर रहा है :

scp -p !(a*) user@machine:/path/directory/.

लेकिन, यदि मैं गंतव्य सर्वर पर हूं और स्रोत सर्वर से प्रतिलिपि बनाना चाहता हूं, तो विफल हो रहा है:

scp -p user@machine:/path/!(a*) .

कोई विचार?

जवाबों:


17

मैं वॉनब्रांड से सहमत हूं। ग्लोबिंग आपके द्वारा चलाए जा रहे शेल द्वारा नियंत्रित किया जाता है। इसलिए scp user@machine:/path/*LOCAL / पथ / * में फ़ाइलों के लिए / path / * का विस्तार करेगा, रिमोट मशीन पर नहीं।

हालाँकि, सिर्फ अनाज के लिए मैंने कोशिश की:

scp "user@machine:/path/[regex here]" .  

और .... यह काम किया। उसकी कोशिश करो। उद्धरणों पर ध्यान दें। अति आवश्यक है। हमें बताऐ।

नोट: दूरस्थ मशीन पर उपयोगकर्ता खाता आपके से भिन्न शेल प्रोग्राम के लिए डिफ़ॉल्ट हो सकता है , इसलिए वाइल्ड कार्ड विस्तार के नियम भिन्न हो सकते हैं, इसलिए 'वेयर वे।


1

यह "रेगुलर एक्सप्रेशन के साथ scp" नहीं है, फ़ाइल ग्लब्स को हैंडल करने वाला शेल है। scpबस पहले से ही विस्तारित फ़ाइलों की सूची सौंप दी जाती है। और विस्तार मशीन पर होता है जहां कमांड चलाया जाता है।

क्षमा करें, आसानी से नहीं किया जा सकता है।


यह उत्तर गलत है। कृपया हटाएं :)
माइकल

1

जो मैंने पाया कि पुराने एचपी-यूएक्स मशीनों (11.11 परिक्रमण) पर, मुझे [^ a] * का उपयोग करना था, लेकिन नई मशीनों (11.31 और नए) पर यह काम करता है! (एक *)

यह वही है जो मैंने समाप्त किया। और यह काम करता है:

    if [[  ${S_MACH} = "phd026a" || ${S_MACH} = "tht030a" ]]
    then
            scp -p -r ${S_MACH}:${S_DIR}/bin/[^a^b^c^p]* ${D_DIR}/bin/.
    else
            scp -p -r ${S_MACH}:${S_DIR}/bin/!((a*)|(b*)|(c*)|(p*)) ${D_DIR}/bin/.
    fi

दोनों समाधान मेरे लिए 11.11 सर्वर पर काम करते हैं।
डार्कहार्ट

0

दूरस्थ नामों scpको वास्तव में एक व्हाट्सएप-अलग-अलग सूची के रूप में दूरस्थ पक्ष पर व्याख्या की जाती है। यह अक्सर एक झुंझलाहट होती है जब आप किसी ऐसी फाइल को कॉपी करने की कोशिश करते हैं जिसका नाम रिक्त स्थान होता है, लेकिन यहां यह उपयोगी है: scp -p 'user@machine:/path/a*' .उन सभी फाइलों को कॉपी करेगा जिनके नाम से शुरू होता है a

यदि आप पैटर्न को उद्धृत करते हैं तो आपकी कमांड काम करेगी, ताकि स्थानीय रूप से इसके बजाय दूरस्थ रूप से व्याख्या की जाए, बशर्ते आप एक और बाधा पार करें। पैटर्न !(a*)एक मूल शेल पैटर्न नहीं है, यह एक ksh एक्सटेंशन है (यदि आप उचित विकल्प सेट करते हैं तो bash और zsh भी समर्थन करते हैं)। तो यह कार्य तभी अपने रिमोट खोल ksh है, अगर नहीं इसे किसी और खोल और तुम हो काम करेंगे exec kshसे .profileया कुछ इसी तरह।

जब तक आप किसी प्रकार के प्रतिबंधित या प्राचीन वातावरण में नहीं होते हैं, तब तक आसान तरीका है scp। आप दूरस्थ फ़ाइलों को स्थानीय फ़ाइलों की तरह ही काम करना चाहेंगे, इसलिए उन्हें स्थानीय फ़ाइलें बनाएँ: दूरस्थ निर्देशिका को sshfs के साथ माउंट करें । इसके लिए दूरस्थ मशीन पर FUSE और रिमोट मशीन पर एक SFTP सर्वर (यानी एक sftp-serverनिष्पादन योग्य जो sshdलॉन्च होता है) की आवश्यकता होती है।

mkdir ~/net/machine
sshfs user@machine:/ ~/net/machine
cp -p ~/net/machine/path/!(a*) .
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.