Rsync ফিল্টার: কেবল একটি প্যাটার্ন অনুলিপি করা


128

আমি এমন একটি ডিরেক্টরি তৈরি করার চেষ্টা করছি যা ল্যাটেক্স থেকে সংকলিত সমস্ত এবং আমার পিডিএফ থাকবে। আমি প্রতিটি প্রকল্পকে একটি পৃথক ফোল্ডারে রাখতে পছন্দ করি, সমস্তগুলি একটি বড় ফোল্ডারে বলা হয় LaTeX। তাই আমি দৌড়ানোর চেষ্টা করেছি:

rsync -avn *.pdf ~/LaTeX/ ~/Output/

যা সমস্ত পিডিএফগুলি খুঁজে পেতে ~/LaTeX/এবং সেগুলি আউটপুট ফোল্ডারে স্থানান্তরিত করে। এটি কাজ করে না। এটি আমাকে বলে যে এটি " *.pdf" এর কোনও মিল নেই । আমি যদি এই ফিল্টারটি ছেড়ে দিই, কমান্ডটি LaTeX এর অধীনে সমস্ত প্রকল্প ফোল্ডারে সমস্ত ফাইল তালিকাভুক্ত করে। সুতরাং এটি * .pdf ফিল্টার নিয়ে সমস্যা। আমি ~/আমার হোম ডিরেক্টরিতে পুরো পথটি প্রতিস্থাপনের চেষ্টা করেছি, তবে এর কোনও প্রভাব ছিল না।

আমি, zsh ব্যবহার করছি। আমি ব্যাশ এবং এমনকি একই জিনিস করছেন চেষ্টা সঙ্গে ফিল্টার যে প্রতি সাব প্রতিটি ফাইল তালিকাভুক্ত ... কি এখানে হচ্ছে?

কেন আমার পিডিএফটি কেবল ফিল্টারই বোঝে না আরএসআইএনসি?


ঠিক আছে. সুতরাং আপডেট করুন: না আমি চেষ্টা করছি

rsync -avn --include="*/" --include="*.pdf" LaTeX/ Output/

এবং এটি আমাকে পুরো ফাইলের তালিকা দেয়। আমার ধারণা কারণ সবকিছু প্রথম প্যাটার্নের সাথে মেলে ...


আহ, আপনি ঠিক বলে মনে করছেন ... যদিও আমার উত্তর (zsh এর **প্যাটার্ন ব্যবহার করে) কাজ করা উচিত।
মার্সেল স্টিমবার্গ

উত্তর:


249

টি এল, ডিআর:

rsync -am --include='*.pdf' --include='*/' --exclude='*' ~/LaTeX/ ~/Output/

Rsync গন্তব্যটিতে উত্স (গুলি) অনুলিপি করে। আপনি যদি *.pdfউত্স হিসাবে পাস করেন তবে শেলটি .pdfবর্তমান ডিরেক্টরিতে এক্সটেনশন সহ ফাইলগুলির তালিকায় এটি প্রসারিত করে । কোনও পুনরাবৃত্তির ট্র্যাভার্সাল ঘটে না কারণ আপনি কোনও ডিরেক্টরি উত্স হিসাবে পাস করেন নি।

সুতরাং আপনার চালানো দরকার rsync -a ~/LaTeX/ ~/Output/, তবে কেবল ফিল্টার অনুলিপি .pdfকরতে আরএসসিএনকে বলতে একটি ফিল্টার সহ । আপনি যখন ম্যানুয়ালটি পড়েন তখন রাইকিঙ্কের ফিল্টার বিধিগুলি বিরক্তিকর মনে হতে পারে তবে কয়েকটি সাধারণ নিয়ম সহ আপনি অনেকগুলি উদাহরণ তৈরি করতে পারেন।

  • অন্তর্ভুক্তি এবং ব্যতিক্রমগুলি:

    • : নামে বা অবস্থান দ্বারা ফাইল বাদ দিয়ে সহজ --exclude=*~, --exclude=/some/relative/location(যেমন এই বাদ উৎস যুক্তি আপেক্ষিক ~/LaTeX/some/relative/location)।
    • আপনি যদি কয়েকটি ফাইল বা অবস্থানের সাথে কেবল মিল করতে চান, সেগুলি অন্তর্ভুক্ত করুন, তাদের দিকে পরিচালিত প্রতিটি ডিরেক্টরি অন্তর্ভুক্ত করুন (উদাহরণস্বরূপ --include=*/), তারপরে বাকীটি বাদ দিন --exclude='*'। এই কারণ:
    • আপনি যদি কোনও ডিরেক্টরি বাদ দেন তবে এটি এর নীচে সমস্ত কিছু বাদ দেয়। বাদ দেওয়া ফাইলগুলি মোটেই বিবেচনা করা হবে না।
    • আপনি যদি কোনও ডিরেক্টরি অন্তর্ভুক্ত করেন তবে এটি স্বয়ংক্রিয়ভাবে এর সামগ্রীগুলি অন্তর্ভুক্ত করে না। সাম্প্রতিক সংস্করণগুলিতে, এটি --include='directory/***'করবে।
    • প্রতিটি ফাইলের জন্য, প্রথম মিলের নিয়ম প্রযোজ্য (এবং কখনই মেলে না এমন কিছু অন্তর্ভুক্ত থাকে না)।
  • প্যাটার্নস:

    • যদি কোনও প্যাটার্নে একটি না থাকে তবে /এটি ফাইলের নাম স্যান্স ডিরেক্টরিতে প্রযোজ্য।
    • যদি কোনও প্যাটার্নটি শেষ হয় তবে /এটি কেবল ডিরেক্টরিতে প্রযোজ্য।
    • যদি কোনও প্যাটার্নটি শুরু হয় /, তবে এটি ডিরেক্টরি থেকে আর্গুমেন্ট হিসাবে পাস করা পুরো পথে প্রযোজ্য rsync
    • *একটি একক ডিরেক্টরি উপাদানটির কোনও স্ট্রিং (যেমন কখনই মেলে না /); **যে কোনও পাথ সাবস্ট্রিংয়ের সাথে মেলে।
  • যদি উত্স আর্গুমেন্টটি একটি দিয়ে শেষ হয় তবে /এর বিষয়বস্তু অনুলিপি করা হয় ( rsync -r a/ bপ্রতিটিের b/fooজন্য তৈরি করে a/foo)। অন্যথায় ডিরেক্টরি নিজেই অনুলিপি করা হয় ( rsync -r a bতৈরি করে b/a)।


সুতরাং এখানে আমাদের অন্তর্ভুক্ত করা উচিত *.pdf, সেগুলি সহ ডিরেক্টরিগুলি অন্তর্ভুক্ত করা উচিত এবং সমস্ত কিছু বাদ দেওয়া উচিত।

rsync -a --include='*.pdf' --include='*/' --exclude='*' ~/LaTeX/ ~/Output/

মনে রাখবেন যে এটি সমস্ত ডিরেক্টরি অনুলিপি করে এমনকি এমন কোনও ফাইলও নেই যা কোনও মেলে না এমন ফাইল বা উপ-ডিরেক্টরিতে রয়েছে। এটি --prune-empty-dirsবিকল্পটি দিয়ে এড়ানো যায় (এটি কোনও সর্বজনীন সমাধান নয় কারণ আপনি পরে কোনও ডিরেক্টরি এটি স্পষ্টভাবে মিলিয়েও অনুলিপি করতে পারবেন না, তবে এটি একটি বিরল প্রয়োজন)।

rsync -am --include='*.pdf' --include='*/' --exclude='*' ~/LaTeX/ ~/Output/

আমার সমাধানের বিপরীতে (zsh এর **প্যাটার্ন ব্যবহার করে), এটি লক্ষ্য dir তে ডিরেক্টরি কাঠামোটি পুনরায় তৈরি করে। আমি নিশ্চিত নই যে এই ওপি কী চায় ...
মার্সেল স্টিমবার্গ

আমি কেবল একটি ডিরেক্টরি অন্তর্ভুক্ত করতে চাইছি এবং সমস্ত ডিরেক্টরি /etc/lsyncd/lsyncd.conf.luaফাইল থেকে বাদ দিতে চাই । কোন ধারণা আছে?
duদুক মিতেশ

@ Duাডুকমিতেশ আমি lsyncd এর সাথে পরিচিত নই। আপনার এটি নতুন প্রশ্ন হিসাবে জিজ্ঞাসা করা উচিত।
গিলস

25
rsync -av --include="*/" --include="*.pdf" --exclude="*" ~/Latex/ ~/Output/ --dry-run

ডিফল্টটি হ'ল সমস্ত কিছু অন্তর্ভুক্ত করা উচিত, সুতরাং আপনার স্থানান্তর করতে চান এমন ফাইলগুলি অন্তর্ভুক্ত করার পরে আপনাকে অবশ্যই স্পষ্টভাবে সবকিছু বাদ দিতে হবে । ফাইলগুলি স্থানান্তর করতে --dry-run সরান।

আপনি যদি দিয়ে শুরু করেন:

--exclude '*' --include '*.pdf'

তারপরে লোভী মিলগুলি সমস্ত কিছু বন্ধ করে দেবে।

যদি তুমি চেষ্টা কর:

--include '*.pdf' --exclude '*' 

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


2
2014-03-17 পর্যন্ত এটি সর্বোত্তম উত্তর, কারণ এটি মূল পোস্টারগুলির প্রশ্নটি ঠিক সমাধান করে । এটি ভোট দিন! আপনি যদি যোগ করেন --prune-empty-dirs(বা শর্টকাট -m) তবে আপনি গন্তব্যটিতে নিজেকে অনেকগুলি ফাঁকা ডিরেক্টরি বাদ দেন, অবশ্যই আপনি এগুলি একটি অনুস্মারক বা কাঠামোগত ব্লুপ্রিন্ট হিসাবে চান।
পোরগ

1
সেরা উত্তর, - অন্তর্ভুক্ত = "* /" কী।
মার্টিন কোনিসেক 5'15

আমি কেবল একটি ডিরেক্টরি অন্তর্ভুক্ত করতে চাইছি এবং সমস্ত ডিরেক্টরি /etc/lsyncd/lsyncd.conf.luaফাইল থেকে বাদ দিতে চাই । কোন ধারণা আছে?
duদুক মিতেশ

15

আপনি যদি কোনও প্যাটার্ন ব্যবহার করেন *.pdfতবে শেলটি সেই প্যাটার্নটিকে "প্রসারিত" করে, অর্থাৎ এটি বর্তমান ডিরেক্টরিতে সমস্ত মিলের সাথে প্যাটার্নটি প্রতিস্থাপন করে। আপনি যে কমান্ডটি চালাচ্ছেন (এই ক্ষেত্রে আরএসসিএনসি) আপনি কোনও প্যাটার্ন ব্যবহার করার চেষ্টা করেছিলেন তা সম্পর্কে অজানা।

আপনি যখন zsh ব্যবহার করছেন তখন একটি সহজ সমাধান পাওয়া যায়, যদিও: **প্যাটার্নটি পুনরাবৃত্তভাবে ফোল্ডারগুলির সাথে মেলানোর জন্য ব্যবহার করা যেতে পারে। এটা চেষ্টা কর:

rsync -avn ~/LaTeX/**/*.pdf ~/Output/

এটি কি বর্তমান ডিরেক্টরিতে কোথাও থেকে সমস্ত পিডিএফ এবং ~ / ল্যাটেক্স / থেকে ~ / আউটপুট থেকে সমস্ত কিছু অনুলিপি করবে না ?
স্যামবি

আমি অনুমান করেছি আপনি বোঝাতে চেয়েছিলেন rsync -avn ~/LaTeX/**/*.pdf ~/Outputতবে এর সাথে সমাধানটি --includeযাইহোক আরও স্কেলযোগ্য।
অ্যাডাম বাইরটেক

দুঃখিত, আমি হতাশায় ভুল টাইপ করা কমান্ডটি সংশোধন করেছি ... আমি সম্মত হই যে অন্তর্ভুক্ত কমান্ডটি (স্যামবির সংস্করণে) আরও ভাল, যদিও এটি আরসিএনসি-র ক্ষেত্রে কিছুটা জটিল এবং নির্দিষ্ট কিছু ক্ষেত্রেও **সম্ভবত কার্যকর হতে পারে।
মার্সেল স্টিমবার্গ

1
বাশ 4 একই বৈশিষ্ট্যটি গ্রহণ করেছে। ওহ, এবং আপনার এখানে আর আর সিএনসি দরকার নেই, সিপি করবে। কিছু সিস্টেমে, যদি প্রচুর ফাইল থাকে তবে এটি cd ~/Latex && cp -p **/*.pdf ~/Output"কমান্ড লাইন খুব দীর্ঘ" ত্রুটি এড়াতে সহায়তা করে ।
গিলস

1
নোট করুন যে অন্তর্ভুক্ত এবং বাদ দেওয়া ফিল্টারগুলিতে আরএসসিএনসি-র নিদর্শনগুলিতে একটি ** থাকে যা একই কাজ করে। আপনি অন্যান্য শাঁস থেকে উদ্ধৃতি চিহ্নগুলিতে রেখে পালাতে পারেন।
ড্যান প্রিটস 16

13

আপনার সমস্যা সমাধানের findজন্য আপনি ফাইল এবং একটি মধ্যবর্তী তালিকা ব্যবহার করতে পারেন files_to_copy। আপনি আপনার হোম ডিরেক্টরিতে রয়েছেন তা নিশ্চিত করুন, তারপরে:

find LaTeX/ -type f -a -iname "*.pdf" > files_to_copy && rsync -avn --files-from=files_to_copy ~/ ~/Output/ && rm files_to_copy

বাশের সাথে পরীক্ষিত।


আমি মনে করি যে সন্ধানটি সর্বাধিক শক্তিশালী সমাধান, তবে আমি ফাইন্ড -execঅপশনটি ব্যবহার বা ব্যবহারের জন্য বেছে নেব xargs। এর মতো কিছু:find LaTeX/ -type f -iname "*.pdf" -print0 | xargs -0 -i rsync -avn {} Output/
স্টিভেন ডি

হ্যাঁ ... আমিও এটির সন্ধানের পরামর্শ দিই ... যদিও আমি ধারণা করি আরএসসিএনই এটি করতে সক্ষম হবে
গ্যাবে

এটি একটি কঠিন সমস্যারও ঝরঝরে সমাধান: সম্ভবত আমি এটি ব্যবহার করতে পারি যার ডকুমেন্ট ক্লাস standaloneবা .texএকই নামের কোনও ফাইল নেই এমন ফাইলগুলি বাদ দিতে , কারণ এগুলি কিছু নথিতে অন্তর্ভুক্ত চিত্রগুলি হবে ...
Seamus

2
আরএসআইএনসি বিকল্পটি স্টিডিনের --files-fromকাছ থেকে পড়া গ্রহণ করে। এটি কাজ করবে find LaTeX/ -type f -a -iname "*.pdf" | rsync -avn --files-from=- ~/ ~/Output/
হুয়ান ক্যালেরো

9

"অন্তর্ভুক্ত / প্যাটার্ন নিয়ম বহির্ভূত" এর অধ্যায় দ্বারা বিচার করা যায় র manpage পথে এই কাজ করতে হয়

rsync -avn --include="*/" --include="*.pdf" ~/Latex/ ~/Output/

এটি এবং কেবিআরডির উত্তরের মধ্যে গুরুত্বপূর্ণ পার্থক্যটি হ'ল --include="*/"পতাকা, যা আরএসসিএনকে এগিয়ে যেতে বলে এবং যে কোনও ডিরেক্টরি এটির নাম নির্ধারণ করেই অনুলিপি করতে বলে। এটি প্রয়োজনীয় কারণ কারণ y সাব-ডিরেক্টরীটি অনুলিপি করার নির্দেশ না দেওয়া হলে আরএসসিএন একটি উপ-ডিরেক্টরিতে পুনরাবৃত্তি করবে না।

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

  1. আপনার ফিল্টারটি সফল এবং জগাখিচুড়ি করা (এরকম একটি পতাকার মাঝখানে খুব সম্ভবত না, যদিও আপনি কখনই জানেন না যে কখন যে নামে একটি ফাইল তৈরি করবে --include=foo.pdf...)

  2. ব্যর্থ হওয়া এবং সম্ভাব্যভাবে কমান্ডটি চালানোর পরিবর্তে একটি ত্রুটি তৈরি করা (যেমন আপনি আবিষ্কার করেছেন যে zsh ডিফল্টরূপে করে)।


সুতরাং এটি কেবল পিডিএফ এবং ডিরেক্টরি কাঠামো অনুলিপি করবে, যখন কেবিআরডি ফাইলগুলি অনুলিপি করবে, তবে কাঠামোটি উপেক্ষা করবে?
Seamus

1
হুম। এটি আসলে এখনও সবকিছু চেষ্টা করে অনুলিপি করে দেখে মনে হচ্ছে, আমি অনুমান করি কারণ এটি ফিল্টার ছাড়াই যা ঘটে তাই includeইতিমধ্যে সেখানে থাকা অতিরিক্ত স্টাফগুলিতে কিছু পরিবর্তন হয় না। আপনি যদি আমার
অর্থটি

7
আপনার --exclude="*"পরে প্রয়োজন --include="*.pdf", বা এটি সবকিছু স্থানান্তর করবে।
jmanning2k

@ jmanning2k: আহ। জানা ভাল!
স্যামবি

4

এটি সম্পর্কে:

rsync -avn --include="*.pdf" ~/Latex/ ~/Output/

না, man rsyncবিকল্পগুলি এবং উত্স / অভ্যাসের আগে ফিল্টারটি রাখে। আমি এটি চেষ্টা করেছি এবং এটি কার্যকর হয়নি
Seamus

আপনার উপায়টি বর্তমান ফোল্ডারে .pdf ফাইলগুলি সন্ধান করে তবে আমি যা চাইছি তা পুনরাবৃত্তভাবে নয়। ( aবিকল্পটি সংরক্ষণাগারটির জন্য এবং অন্যান্য জিনিসগুলির মধ্যে এটি অনুলিপিটিকে পুনরাবৃত্ত করে তোলে
সিউমাস

1
উফফফ, আমার খারাপ। আমি আমার উত্তর আপডেট।
kbyrd

এত কাছাকাছি থাকার জন্য, এবং ম্যানুয়াল পৃষ্ঠায় কীভাবে প্রাসঙ্গিক উপাদান খুঁজে পাবেন সে সম্পর্কে আমাকে একটি সূত্র দেওয়ার জন্য +1। (আশা করি আমি এমনকি এটি পেয়েছি। :-)
SamB

3

এখানে এমন কিছু রয়েছে যা ব্যবহার না করেই কাজ করা উচিত। ইতিমধ্যে পোস্ট করা উত্তরগুলি থেকে পার্থক্য হ'ল ফিল্টার নিয়মের ক্রম। আরএসসিএনসি কমান্ডের ফিল্টার বিধিগুলি প্রচুর পরিমাণে iptable নিয়মের মতো কাজ করে, প্রথম বিধি যে কোনও ফাইলের সাথে মেলে এটিই ব্যবহৃত হয়। থেকে ম্যানুয়েল পৃষ্ঠা :

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

সুতরাং, আপনার নিম্নলিখিত কমান্ডের প্রয়োজন:

rsync -avn --include="**.pdf" --exclude="*" ~/LaTeX/ ~/Output/

"**। পিডিএফ" প্যাটার্নটি নোট করুন। ম্যান পৃষ্ঠা অনুসারে :

যদি প্যাটার্নটিতে একটি / (একটি অনুসরণযোগ্য গণনা করা হয় না)) বা "**" থাকে তবে এটি কোনও শীর্ষস্থানীয় ডিরেক্টরি সহ পুরো পথের নামের সাথে মিলে যায়। যদি প্যাটার্নটিতে একটি / বা "**" না থাকে, তবে এটি কেবল ফাইলের চূড়ান্ত উপাদানটির সাথে মেলে। (মনে রাখবেন যে অ্যালগরিদমটি পুনরাবৃত্তভাবে প্রয়োগ করা হয় সুতরাং "সম্পূর্ণ ফাইলের নাম" আসলে নীচের দিকের ডিরেক্টরিটি থেকে কোনও পথের কোনও অংশ হতে পারে

আমার ছোট পরীক্ষায় এটি ডিরেক্টরি ট্রিতে পুনরাবৃত্তভাবে কাজ করে এবং কেবল পিডিএফগুলি নির্বাচন করে।


আপনি ঠিক কিভাবে পরীক্ষা করেছেন? ডকুমেন্টেশন এবং আমার পরীক্ষামূলক যাচাইকরণ সম্পর্কে আমার ধারণা অনুসারে, আপনার আদেশটি কেবল *.pdfশীর্ষ স্তরের ডিরেক্টরিতে কপি করা উচিত (তবে নয় ~/LaTeX/foo/bar.pdf)।
গিলস

@ গিলিস ক্রুড তুমি ঠিক. আমি শপথ করেছিলাম আমি এটি পরীক্ষা করেছি এবং এটি কার্যকর হয়েছে, তবে আমি এটি পুনরায় তৈরি করতে পারি না। এবং এখন আমি যে ম্যান পৃষ্ঠাটি আমি উদ্ধৃত করেছি তা পড়েছি, এটি বোঝা যায় যে এটি কার্যকর হয় না। অসন্তোষ প্রকাশ।
স্টিভেন ডি

1
ঠিক আছে, আমি বুঝতে পেরেছিলাম যে আমার পরীক্ষাটি কোথায় ভুল ছিল। আমার "ছোট পরীক্ষা" একটি ডিরেক্টরিতে ছিল যেটিতে আমার নিজের .tex এবং .pdf ফাইল রয়েছে। তারপরে আমি সেই সাবডিরটিতে একটি "পরীক্ষা" উপ-ডিরেক্টরি এবং একটি টেস্ট.পিডিএফ এবং টেস্ট.টেক্স তৈরি করেছিলাম। যাইহোক, আমি লক্ষ করতে ব্যর্থ হয়েছি যে আমার শীর্ষ স্তরের ডিয়ারে একটি পরীক্ষা.পিডিএফ ছিল, সম্ভবত আমি লটেক্সের কিছু দ্রুত পরীক্ষার কারণে করেছি।
স্টিভেন ডি

আমি এখনও বুঝতে পারি না **। এর উদাহরণ পেয়ে ভালো লাগবে। ;)
বুটজ

2

এটি আমার পছন্দের সমাধান:

find source_dir -iname '*.jpg' -print0 |  rsync -0 -v --files-from=- . destination_dir/

findকমান্ড চেয়ে বুঝতে অন্তর্ভুক্ত / নিয়ম বাদ দেওয়ার সহজ rsync:-)

আপনি যদি কেবল পিডিএফ ফাইলগুলি অনুলিপি করতে চান তবে কেবল পরিবর্তন .jpgকরুন.pdf

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