স্ক্র্যাপ ব্যবহার করে দিরকে পুনরাবৃত্তভাবে অনুলিপি করতে কীভাবে ফাইলগুলি ফিল্টার করবেন?


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ক্লাস ফাইলগুলিতে কীভাবে সেগুলি ফিল্টার করব ?


আমি উল্লিখিত rsync বিকল্পটি পছন্দ করি। আপনি যদি উল্লেখ করেননি যে এটি এক-অফ অপারেশন, বা আপনি যদি বারবার এটি স্বয়ংক্রিয়ভাবে চলছেন। এক-অফ অপারেশনের জন্য, ফাইন্ড, গ্রেপ-ভি, এক্সার্গস এবং অস্থায়ী ফাইলগুলির ন্যায়বিচারের ব্যবহারের এটির সংক্ষিপ্ত কাজ করা উচিত।
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
যাইহোক এই সাবফোল্ডারগুলিকে উপেক্ষা করার জন্য যেগুলিতে * ক্লাস ফাইল নেই? (যেমন আমি একগুচ্ছ খালি ডায়ার চাই না)
গ্রান্ট বার্চমিয়ার

ভয়ঙ্কর, এবং এটি খুব মন্দ!
প্রসাদ চালশানী

4
আপনি কি ব্যাখ্যা করতে পারবেন - অন্তর্ভুক্ত করুন, না - অন্তর্ভুক্ত = এমএএন পৃষ্ঠাগুলিতে, আমি ব্যাখ্যা
কিনে

4
বিকল্পটি -aইতিমধ্যে -rrsync ম্যান পেজ অনুসারে অন্তর্ভুক্ত রয়েছে ।
জর্জি স্কলি

4
@ গ্রান্ট বার্চমিয়ার --prune-empty-dirsখালি ডায়ারগুলি সরিয়ে ফেলবে।
এলরন্ড 1337

75

বেস ডিরেক্টরিতে ডটফাইলগুলি বাদ দিতে:

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

[!.]* একটি শেল গ্লোব যা বিন্দু দিয়ে শুরু না করে ওয়ার্কিং ডিরেক্টরিতে সমস্ত ফাইলগুলিতে প্রসারিত হয়।


10
এটি সম্ভবত সেরা উত্তর; ফাইলগুলি ফিল্টার করতে গ্লোব ব্যবহার করা যায়।
যোশুয়া ওয়্যূটস

4
যদি আপনার বিকল্পটি আমার মতো স্ক্রিপ-এর মধ্যে সীমাবদ্ধ থাকে তবে এটি অবশ্যই সহায়তা করেছিল।
ব্যবহারকারী28095

4
এটি জিজ্ঞাসা করার মতো ফাইলগুলি বাদ দেওয়ার ইঙ্গিত দেয়, তবে কীভাবে এটি সম্পূর্ণ ডিরেক্টরিতে অর্জন করা যায়?
পিল

Zsh এর জন্য:scp -r [\!.]* server:/path/to/something
মাইকেল বার-সিনাই

37

ফিল্টার করার জন্য স্কিপ-তে কোনও বৈশিষ্ট্য নেই। এই জাতীয় "উন্নত" জিনিসগুলির জন্য, আমি আরএসসিএনসি ব্যবহারের পরামর্শ দিচ্ছি:

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

(এই লাইনটি দূরবর্তী ফোল্ডার থেকে বর্তমান একটিতে কপিরাইট করুন

ডিফল্টরূপে স্বয়ংক্রিয়ভাবে একটি এসএসএস সংযোগের মাধ্যমে আরএসএনসি টানেলের সাম্প্রতিক সংস্করণ।


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এবং sshOS এ ইনস্টল করা নেই। পরিবর্তে, এটি একটি চতুর কাজ ছিল। ধন্যবাদ!
রেয়রিং

2

ফাইলগুলির জন্য কমান্ডের নীচে।

scp `সন্ধান করুন। -ম্যাক্সডেপথ 1-নাম "* .লগ" \! -নাম "hs_err_pid2801.log" - টাইপ f` মূল @ আইপি: / tmp / পরীক্ষা /

  1. আইপি হবে গন্তব্য সার্ভারের আইপি ঠিকানা।
  2. ফাইল অন্তর্ভুক্ত করার জন্য "* .log" নাম দিন।
  3. ! ফাইল বাদ দেওয়ার জন্য "hs_err_pid2801.log" নাম দিন।
  4. । বর্তমান কাজ স্যার।
  5. ফাইল টাইপের জন্য টাইপ চ।

ডিরেক্টরি কমান্ড নীচে।

scp -r `সন্ধান করুন। -ম্যাক্সডেপথ 1 -র নাম "লো *" \! -নেম "লোকালহোস্ট" - টাইপ ডি রুট @ আইপি: / টিএমপি / টেস্ট /

আপনি আপনার প্রয়োজন অনুসারে উপরের কমান্ডটি কাস্টমাইজ করতে পারেন।


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

আপনি যদি সত্যিই স্কিপি ব্যবহার করতে চান তবে একটি অপ্রত্যক্ষ উপায় আছে ayআমি আমরা স্থানীয় ফোল্ডার '/ src' এর অধীনে সমস্ত .jpg ফাইল রিমোট সার্ভারে '/ 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

4
কোডের সাথে মৌখিক ব্যাখ্যাগুলিও সহায়ক
কন

-1
  1. এতে আপনার উত্স ফোল্ডারটি অনুলিপি করুন somedir :

    সিপি -আর srcdir somedir

  2. সমস্ত অপ্রয়োজনীয় ফাইলগুলি সরান:

    somedir -name '.svn' -exec rm -rf {} \ + সন্ধান করুন

  3. থেকে scp আরম্ভ somedir


কেন এই উত্তরটি সব নিম্নগামী? এটি প্রশ্নের সমাধানের মত শোনাচ্ছে।
বিক্রোলল

7
কারণ এটি অপ্রয়োজনীয় ফাইলগুলির একগুচ্ছ অনুলিপি করে তারপরে মুছে ফেলবে, সম্ভাব্য প্রচুর সময় নষ্ট করবে।
ওডে

এমন একটি প্রোগ্রামের জন্য যা বেশ কয়েকটি সংকলন পদক্ষেপের মধ্য দিয়ে যায়, এটি আসলে প্রচুর অর্থবোধ করে। সংকলিত কোডটিকে একটি tarবা- zipফাইলে প্যাক করে এমন পদক্ষেপের আগেই এটি ঠিক যেতে পারে । পরিবর্তে, কোনও সংক্ষেপণ নেই (scp সংকোচন করে) এবং 'প্যাকেজড' কোড অনুলিপি হয়ে যায়।
samvv

সত্য যে @ সাম্বভিভ (সমস্ত সেটআপ, পরিবেশের উপর নির্ভর করে)
সান জে ফ্যালকন

স্থানগুলির সীমাবদ্ধতার কারণে যদি ফাইলগুলি উপেক্ষা করা হয়, তবে এটি স্থানের পাশাপাশি সময়ের অপচয় করে
জেক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.