rsync অনুলিপি ব্যবহার করে কেবলমাত্র নির্দিষ্ট ধরণের ফাইলের অনুলিপি করুন


110

আমি কেবলমাত্র নির্দিষ্ট এক্সটেনশনের ফাইলগুলি (এই ক্ষেত্রে * .sh) অনুলিপি করতে নীচের বাশ স্ক্রিপ্টটি ব্যবহার করি, তবে এটি এখনও সমস্ত ফাইলের অনুলিপি করে। কোনো সমস্যা?

= $ 1 থেকে
= $ 2

rsync -zarv --incolve = "*। sh" $ থেকে। থেকে

4
কঠোরভাবে সম্পর্কিত না বলার পরে, আমি $ থেকে / $ থেকে উদ্ধৃতি দেওয়ার পরামর্শ দেব। যদি এমন না হয় তবে আপনাকে অপ্রত্যাশিত ফলাফল দিতে পারে যদি অবস্থানগত আর্গুমেন্টে 1/2 ফাঁকা স্থান অন্তর্ভুক্ত করে।
কেজেটিল জোর্জেনসেন

আপনার আদেশটি কেন কাজ করে না কেন আপনি বুঝতে পেরেছেন?
চার্লি পার্কার

@ চর্লিপার্কার: আপনার কি ব্যবহার করতে হবে rsync, শেল ইন্টার্নাল দিয়ে এটি খুব ভালভাবে অর্জন করা যেতে পারে?
ইনিয়ান

এই প্রশ্ন এবং এর উত্তরগুলিরও কি অভাব তা হ'ল যদি আমার কাছে পুনরাবৃত্ত ডিরেক্টরিগুলি থাকে যা আমি কেবল এক ধরণের ফাইল প্রেরণ করতে চাই তবে কমান্ডটি কীভাবে তৈরি করা যায়। দেখে মনে হচ্ছে এটি কেবল লক্ষ্য ডিরেক্টরিতে এটি করে ...
চার্লি পার্কার

উত্তর:


199

আমি মনে করি --includeযে --excludeকেবলমাত্র সেই ফাইলগুলি অন্তর্ভুক্ত না করে কেবলমাত্র ফাইলগুলি উপসেট অন্তর্ভুক্ত করার জন্য ব্যবহৃত হয় otherwise অন্য কথায়: আপনার সম্পর্কে ভাবতে হবে বাদ দিতে হবে অর্থ অন্তর্ভুক্ত করতে হবে

পরিবর্তে চেষ্টা করুন:

rsync -zarv  --include "*/" --exclude="*" --include="*.sh" "$from" "$to"

আরএসসিএনসি সংস্করণ .6.০. or বা তার চেয়ে বেশি সংস্করণের জন্য, আদেশটিকে নিম্নরূপে সংশোধন করা দরকার (মন্তব্যগুলি দেখুন):

rsync -zarv --include="*/" --include="*.sh" --exclude="*" "$from" "$to"

-mপতাকা যুক্ত করা গন্তব্যে খালি ডিরেক্টরি কাঠামো তৈরি করা এড়াবে। সংস্করণ 3.1.2 পরীক্ষিত।

সুতরাং আমরা যদি কেবল * .sh ফাইল চাই তবে আমাদের সমস্ত ফাইল বাদ দিতে হবে --exclude="*", সমস্ত ডিরেক্টরি অন্তর্ভুক্ত করতে হবে--include="*/" অন্তর্ভুক্ত করতে হবে এবং সমস্ত * .sh ফাইল অন্তর্ভুক্ত করতে হবে --include="*.sh"

আপনি বিভাগে কিছু ভাল উদাহরণ জানতে পারেন অন্তর্ভুক্ত করুন / প্যাটার্ন বিধি বাদ দিন এর man পৃষ্ঠা


10
যদিও এটি আপনাকে সমস্ত উপ-ডিরেক্টরিগুলি পেয়ে যাবে, যদি আপনি সাবসিডেরিতে সাব। ডিরেক্টরিতে কোনও .sh ফাইল উপস্থিত থাকেন তবে আপনি --incolve = "* /" ব্যবহার করতে চান এমন সম্ভাবনা রয়েছে।
কেজেটিল জোর্জেনসেন

50
আমি এটি আরএসসিএনসি সংস্করণ .7.০..7 এ চেষ্টা করেছি, যা আমি ম্যাকপোর্টগুলি থেকে অনেক আগে পেয়েছি এবং এটি অন্তর্ভুক্ত / বাদ দিয়ে এই ক্রমটি নিয়ে কাজ করে নি। এটিই আমার পক্ষে কাজ করেছিল (ওপি-র জন্য অভিযোজিত) : rsync -zarv --include="*/" --include="*.sh" --exclude="*" "$from" "$to".
বিজো ট্রাভয়েল

3
আমি rsync 3.0.9 দিয়ে চেষ্টা করেছি এবং এটি কার্যকর হয়নি। বিজো ঠিক বলেছেন, ক্রমটি যথাযথ নয় (প্রথমে --include=\*.shতারপরে --exclude=\*)
সত্য

3
মনে রাখবেন যে আপনি সর্বদা সম্পাদনা ক্লিক করতে পারেন এবং উত্তরের জন্য একটি সম্পাদনার পরামর্শ দিতে পারেন :)
অচল ডেভ

2
এটি আপনার অন্তর্ভুক্ত / অন্তর্ভূক্তির ক্রমটির সাথে কাজ করে না, তবে এটি বিজো ট্রাভাইলের প্রস্তাবিত আদেশের সাথে কাজ করে
জন স্মিথ

57

@ চেপনারের উত্তরগুলি সমস্ত সাব-ডিরেক্টরিগুলি অনুলিপি করে তা নির্বিশেষে এতে ফাইলটি রয়েছে কিনা তা অন্তর্ভুক্ত থাকবে। আপনার যদি এমন সাব-ডিরেক্টরিগুলি বাদ দিতে হয় যা ফাইলগুলি ধারণ করে না এবং এখনও ডিরেক্টরি কাঠামো ধরে রাখে, ব্যবহার করুন

rsync -zarv  --prune-empty-dirs --include "*/"  --include="*.sh" --exclude="*" "$from" "$to"

1
এটি আমার জন্য প্রয়োজনীয়তা ছিল: "আপনার যদি সেই সাব-ডিরেক্টরিগুলি বাদ দিতে হয় যা ফাইলটি ধারণ করে না এবং এখনও ডিরেক্টরি কাঠামো ধরে রাখতে পারে" +1
জুলুস ওহটনেন

1
আমি বুঝতে পারছি না - অন্তর্ভুক্তদের ক্রমটি কী ছিল আপনি কীভাবে জানেন?
চার্লি পার্কার

1
যদি আমার কাছে পুনরাবৃত্ত ডিরেক্টরিগুলি থাকে যা আমি কেবল এক ধরণের ফাইল প্রেরণ করতে পারি তবে কীভাবে একটি কমান্ডটি ক্রেফ করবে। দেখে মনে হচ্ছে এটি কেবল লক্ষ্য ডিরেক্টরিতে এটি করে।
চার্লি পার্কার

15

আরও একটি সংযোজন: যদি আপনার কেবলমাত্র একটি দির (এক্সপিশন ছাড়াই) এর এক্সটেনশনের মাধ্যমে ফাইলগুলি সিঙ্ক করতে হয় তবে আপনার এইরকম একটি নির্মাণ ব্যবহার করা উচিত:

rsync -auzv --include './' --include '*.ext' --exclude '*' /source/dir/ /destination/dir/

প্রথম দিকে বিন্দুর প্রতি আপনার মনোযোগ দিন --include--no-rএই নির্মাণে কাজ করে না।

সম্পাদনা করুন:

মূল্যবান মন্তব্যের জন্য gbyte.co কে ধন্যবাদ!


1
আপনি কীভাবে জানবেন যে পতাকাগুলির ক্রম কী হতে হবে এবং তাদের কী অন্তর্ভুক্ত করার দরকার ছিল?
চার্লি পার্কার

1
@ চর্লিপার্কার, কারণ আরএসসিএনসি includeও সেগুলি excludeঅপশনগুলি যেভাবে নির্দিষ্ট করেছে সেগুলি ব্যবহার করে this এগুলি ছাড়াও এটি প্রথম মিলিত স্থানে থামে। সুতরাং, আমরা --exclude '*'এই উদাহরণে প্রথম স্থানে নির্দিষ্ট করে নিলে আরএসসিএনসি কিছুই করবে না। আরও ব্যাখ্যা জন্য লোকটি দেখুন।
সার্জে রাউসাক

আপনি কি আমাকে বুঝিয়ে দিতে পারবেন যে প্রতিটি পতাকা কী করছে? প্রথম পতাকাটি -- include './' কি উত্স ডিরেক্টরি পথে সমস্ত কিছু অন্তর্ভুক্ত করে বলছে? তারপরের পরেরটি - - অন্তর্ভুক্ত করুন '.xt'` নামের উত্স পথে নির্দিষ্ট ফাইল অন্তর্ভুক্ত করুন .extএবং তারপরে বাদ পড়ুন বলে অন্য কিছু পাঠান না --exclude '*'? এটা কি ঠিক?
চার্লি পার্কার

1
যদি আমার কাছে পুনরাবৃত্ত ডিরেক্টরিগুলি থাকে যা আমি কেবল এক ধরণের ফাইল প্রেরণ করতে পারি তবে কীভাবে একটি কমান্ডটি ক্রেফ করবে। দেখে মনে হচ্ছে এটি কেবল লক্ষ্য ডিরেক্টরিতে এটি করে।
চার্লি পার্কার

1
এর জন্য ধন্যবাদ! দরকার --include '*.ext'এবং নেই--include '.ext'
gbte

13

ম্যান পৃষ্ঠা থেকে গুরুত্বপূর্ণ অংশটি এখানে:

স্থানান্তর করার জন্য ফাইল / ডিরেক্টরিগুলির তালিকা তৈরি হওয়ার সাথে সাথে, আরএসসিএনসি প্রতিটি নাম পরিবর্তনের পরিবর্তে প্যাটার্নগুলি অন্তর্ভুক্ত / বাদ দেওয়ার তালিকার বিপরীতে স্থানান্তরিত করার জন্য পরীক্ষা করে এবং প্রথম মিলের প্যাটার্নটিতে কাজ করা হয়: যদি এটি কোনও বহিরাগত প্যাটার্ন হয়, তবে সেই ফাইলটি হ'ল এড়ানো; যদি এটি অন্তর্ভুক্ত প্যাটার্ন হয় তবে ফাইলের নামটি এড়ানো যায় না; যদি কোনও মিলের প্যাটার্ন পাওয়া যায় না, তবে ফাইলের নামটি এড়ানো যায় না।

সংক্ষেপ:

  • কোনও প্যাটার্ন মিলছে না মানে একটি ফাইল অনুলিপি করা হবে!
  • যে কোনও প্যাটার্ন মিললে অ্যালগরিদম ছেড়ে যায়

এছাড়াও, একটি স্ল্যাশের সাথে শেষ হওয়া কিছু হ'ল ডিরেক্টরিগুলি (যেমন চাই find -type d) matching

এই উত্তর উপরে থেকে টানুন।

rsync -zarv  --prune-empty-dirs --include "*/"  --include="*.sh" --exclude="*" "$from" "$to"
  1. কোনও ডিরেক্টরি এড়িয়ে চলবেন না
  2. কোনও .shফাইল এড়িয়ে চলবেন না
  3. সব কিছু বাদ দিন
  4. (স্পষ্টতই, কিছু এড়িয়ে চলবেন না, তবে উপরের নিয়মটি ডিফল্ট নিয়মকে কখনও ঘটতে বাধা দেয়))

অবশেষে, --prune-empty-directoriesস্থানগুলি জুড়ে খালি ডিরেক্টরি তৈরি থেকে প্রথম নিয়মটি রাখে।


কী চলছে তা বোঝানোর জন্য আপনাকে অনেক ধন্যবাদ। এখন আরও অনেক ভাল সুযোগ আছে যে আমি কমান্ডটি ভুলব না।
মোহাম্মদজেজ

3
'' অ্যালগরিদম একবারে কোনও প্যাটার্ন মিলে যায় " - এটি কী, এবং উচ্চ-রেট করা উত্তরগুলির মধ্যে কোনওই এটিকে এখানে আপনি যেমন করেছেন তেমন স্পষ্টভাবে এবং আপ-ফ্রন্ট হিসাবে ব্যাখ্যা করে না course অবশ্যই এটি হয় man পৃষ্ঠা somehwere, এবং যদি আমি পুরো জিনিসটি মনোযোগ সহকারে পড়ব, আমি তা দেখে
ফেলেছি

0

যদি কেউ এটির জন্য সন্ধান করে ... আমি কেবলমাত্র নির্দিষ্ট ফাইল এবং ফোল্ডারগুলিকেই সিএসএন করতে চেয়েছি এবং এই আদেশ দিয়ে এটি পরিচালনা করতে পেরেছি: rsync --include-from=rsync-files

আরএসআইএনসি-ফাইল সহ:

my-dir/
my-file.txt

- /*

0

এই কুশলী ফাংশন লিখেছে এবং আমার ব্যাশ স্ক্রিপ্ট বা রাখা ~/.bash_aliases। স্থানীয়ভাবে লিনাক্সে ব্যাশ এবং awkইনস্টল করে সিঙ্ক করার পরীক্ষিত । এটা কাজ করে

selrsync(){
# selective rsync to sync only certain filetypes;
# based on: https://stackoverflow.com/a/11111793/588867
# Example: selrsync 'tsv,csv' ./source ./target --dry-run
types="$1"; shift; #accepts comma separated list of types. Must be the first argument.
includes=$(echo $types| awk  -F',' \
    'BEGIN{OFS=" ";}
    {
    for (i = 1; i <= NF; i++ ) { if (length($i) > 0) $i="--include=*."$i; } print
    }')
restargs="$@"

echo Command: rsync -avz --prune-empty-dirs --include="*/" $includes --exclude="*" "$restargs"
eval rsync -avz --prune-empty-dirs --include="*/" "$includes" --exclude="*" $restargs
}

Avantages:

যখন কেউ আরও যুক্তি যুক্ত করতে চায় (যেমন --dry-run)।

উদাহরণ:

selrsync 'tsv,csv' ./source ./target --dry-run
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.