নিয়মিত এক্সপ্রেশন দিয়ে কীভাবে স্ক্র্যাপ করবেন


13

আমি ksh তে "a" অক্ষর দিয়ে শুরু না হওয়া সমস্ত ফাইল অনুলিপি করার চেষ্টা করছি।

গন্তব্য মেশিনে উত্স মেশিন থেকে অনুলিপি করা ঠিকঠাক কাজ করছে :

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

তবে, যদি আমি গন্তব্য সার্ভারে আছি এবং উত্স সার্ভার থেকে অনুলিপি করতে চাই, ব্যর্থ হচ্ছে:

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

কোন ধারনা?

উত্তর:


17

আমি ভনব্র্যান্ডের সাথে একমত গ্লোবিং আপনি যে শেলটি চালাচ্ছেন তা পরিচালনা করে So তাই scp user@machine:/path/*দূরবর্তী মেশিনে নয়, লোকাল / পাথ / * এ থাকা ফাইলগুলিতে / পথ / * প্রসারিত করবে।

তবে, কেবল গ্রিনের জন্য আমি চেষ্টা করেছি:

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

এবং এটা কাজ করে. চেষ্টা কর. উদ্ধৃতি দ্রষ্টব্য। খুব প্রয়োজনীয়. আমাদের জানতে দাও.

দ্রষ্টব্য: রিমোট মেশিনে থাকা ব্যবহারকারী অ্যাকাউন্টটি আপনার চেয়ে আলাদা শেল প্রোগ্রামে ডিফল্ট হতে পারে , তাই ওয়াইল্ড কার্ডের প্রসারণের নিয়ম আলাদা হতে পারে, তাই 'সতর্কতা অবলম্বন করুন।


1

এটি "নিয়মিত এক্সপ্রেশন সহ স্ক্রিপ" নয়, ফাইল গ্লোব পরিচালনা করে এমন একটি হ'ল শেল। scpসবেমাত্র ফাইলগুলির ইতিমধ্যে বর্ধিত তালিকা হস্তান্তরিত হয়। এবং প্রসারটি সেই মেশিনে ঘটে যেখানে কমান্ডটি চালিত হয়।

দুঃখিত, সহজেই করা যায় না।


এই উত্তরটি ভুল। দয়া করে সরান :)
মাইকেল

1

আমি যেটা পেয়েছি তা হ'ল পুরানো এইচপি-ইউএক্স মেশিনে (পরক ১১.১১), আমাকে ব্যবহার করতে হয়েছিল [^ এ] * তবে, নতুন মেশিনে (প্যারিস ১১.৩১ এবং আরও নতুন) এটির সাথে কাজ করে! (ক *)

এটিই আমি শেষ করেছি। এবং এটি কাজ করে:

    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 হয়, এটি অন্য কোনও শেল এবং আপনার exec kshথেকে .profileবা এর অনুরূপ কিছু না হলে নয় ।

সহজ উপায়, যদি না আপনি কোনওরকম সীমাবদ্ধ বা এন্টিকের পরিবেশে থাকেন তবে তা ভুলে যাওয়া scp। আপনি স্থানীয় ফাইলের মতো দূরবর্তী ফাইলগুলিও কাজ করতে চান, তাই তাদের স্থানীয় ফাইল করুন: sshfs সহ দূরবর্তী ডিরেক্টরিটি মাউন্ট করুন । এটির জন্য স্থানীয় মেশিনে FUSE এবং রিমোট মেশিনে একটি SFTP সার্ভার (অর্থাত্ একটি sftp-serverনির্বাহযোগ্য যা sshdপ্রবর্তনযোগ্য) প্রয়োজন।

mkdir ~/net/machine
sshfs user@machine:/ ~/net/machine
cp -p ~/net/machine/path/!(a*) .
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.