আমি কীভাবে 'ডিফ-এক্স' তৈরি করতে পারি নির্দিষ্ট ফাইলগুলিকে উপেক্ষা করে ফাইল নাম রাখি না?


29

এরকম: diff -r -X <ignore-list> <src-dir> <dest-dir>

এগুলি ফর্মের diffমধ্যে <ignore-list>থাকলে এগুলিকে এড়ানো হবে বলে মনে হয় না <dir>/<file>

ফর্মের এন্ট্রি <file> তবে বিবেচনা করা হবে। এটি একটি সমস্যা যেহেতু আমার কাছে <file>বিভিন্ন সাব ডিরেক্টরিতে একাধিক ফাইলের নাম থাকতে পারে যার মধ্যে কয়েকটি আমি উপেক্ষা করতে চাই না।

উভয়টির জন্যই ম্যানপেজে প্যাটার্ন সিনট্যাক্স সম্পর্কিত খুব বেশি তথ্য আছে বলে মনে diffহয় না। আমি যা বলতে পারি তা থেকে এটি কেবলমাত্র একটি ফাইলের ভিত্তি নাম যা ডিফ দ্বারা বিবেচিত হয় (দেখুন http://forums.gentoo.org/viewtopic-t-889788-start-0.html যদি আপনি আগ্রহী হন)।


মানুষ, diffএর --excludeবিকল্পটি খুব
চিত্তাকর্ষক

উত্তর:


30

ডিরেক্টরি ডিরেক্টরি কাজ করা উচিত; উদাহরণস্বরূপ, আমি এখানে কোনও স্ক্রিপ্ট ব্যবহার করেছি (ধরে নিলাম gnu ভিন্ন),

diff -r \
   --exclude="*~" \
   --exclude=".svn" \
   --exclude=".git" \
   --exclude="*.zip*" \
   --exclude="*.gz" \
   --exclude="*.tar" \
   ...etc

... যা লিখিত সামগ্রী .svnএবং .gitডায়ারগুলিকে উপেক্ষা করে তবে *.zip/ *.gz/ ইত্যাদি নামে পৃথক পৃথক ফাইলগুলিও উপেক্ষা করে ।

সম্পাদনা করুন: ফর্মের পাথগুলি ফিল্টার করার জন্য dir_a/file1তবে এখনও diffএকই বেসনযুক্ত ফাইলগুলি যেমন dir_b/file1বা বা dir_a/b/file1, তারপরে ফাইলগুলির একটি তালিকা diffতৈরি করতে হবে (উদাহরণস্বরূপ, ব্যবহার করে find), এবং এই পাথগুলি থেকে প্রাপ্ত ফাইলের তুলনা করার জন্য ফাইলটি; যেমন, দেওয়া

$ find ONE TWO -type f -print 
ONE/a/1.txt
ONE/a/2.txt
ONE/a/b/2.txt
TWO/a/1.txt
TWO/a/2.txt
TWO/a/b/2.txt

আপনি তুলনা করতে ফাইলগুলির তালিকা তৈরি করেন, উদাহরণস্বরূপ ব্যতীত */a/2.txtতবে এখনও নামযুক্ত অন্যান্য ফাইলের সাথে তুলনা করুন 2.txt। কেবলমাত্র "সন্ধান করুন" ব্যতীত সমস্ত ফাইল ONE/a/2.txt(একটি রেজি এক্সপ্যাক্টও এখানে ব্যবহার করা যেতে পারে .*/a/2.txt)

$ find ONE -type f \( ! -regex 'ONE/a/2.txt' \) \
    -exec bash -c 'diff -q "${1}" "${2/ONE/TWO}"' - {} {} \;  

যা কার্যকরভাবে উপেক্ষা করে ONE/a/2.txt(এবং TWO/a/2.txt), কিন্তু এখনও অন্য নামের ফাইলগুলির তুলনা করে 2.txt:

diff -q ONE/a/1.txt TWO/a/1.txt
diff -q ONE/a/b/2.txt TWO/a/b/2.txt

সম্পাদনা করুন: বা আরও মজাদার find(অতিরিক্ত মজা পাঠকের জন্য অনুশীলন হিসাবে ছেড়ে দেওয়া হয়েছে), বাদ দিতে ফাইল বা ডিরেক্টরি নির্বাচন করুন এবং তারপরে diffসমস্ত কিছু:

$ find ONE \( -regex 'ONE/a/2.txt' -o -name b  -prune \)  \
    -o -type f -exec bash -c 'echo diff -q "${1}" "${2/ONE/TWO}"' - {} {} \

উপরের উদাহরণটিতে "{শীর্ষ} /a/2.txt", "বি" নামের যে কোনও ডিরেক্টরি, এবং অন্য সমস্ত কিছু পৃথক পৃথক ফাইল বাদ দেয়। (সরল " -name b" এর পরিবর্তে আপনি " -regex '.*/b'" - নোট, কোনও পিছনে "/" ব্যবহার করতে পারেন ))


2
ধন্যবাদ তবে আমি মনে করি আপনি পয়েন্টটি মিস করছেন। আপনি যখন 'বেস-নাম' ব্যবহার করেন তখন কেবলমাত্র সমর্থনটিই মনে হয়। এটি কোনও ডিরেক্টরি বা কোনও ফাইলের নাম হতে পারে। উভয় ক্ষেত্রেই, আপনি যা চেয়েছিলেন তা ভিন্নভাবে উপেক্ষা করে। আপনি যখন পথ ব্যবহার করেন তখন সমস্যা দেখা দেয়। উদাহরণস্বরূপ, আমি / an / পরম / পথ / to / a / ফাইল বা ./a/relative/path/to/a/file উপেক্ষা করার জন্য পৃথক হতে পারি না।
অ্যাশ

2
ডিফ - এক্সক্লুড = "/ এই / নির্দিষ্ট / ফাইল / যে / আইএম / স্পষ্টতই / আর্জি জানায় / আপনি / উপেক্ষা"। এটি কাজ করবে না।
অ্যাশ

3
সঠিক, excludeনিদর্শনগুলি ফাইলের বেসনামের সাথে মেলে ( gnu.org/software/diffutils/manual/html_node/… অনুসারে ); পাথগুলি (যেমন হিসাবে foo/bar.txt) কাজ করবে না । এটি করতে, আপনাকে সম্ভবত findফাইলনামগুলির তালিকা তৈরি করতে দৌড়াতে হবে এবং তুলনা করার জন্য ফাইলটির পথ অর্জন করতে হবে।
মাইকেল 25

diffকেবলমাত্র ব্যবহারের পরিবর্তে ফাইল পাথ বাদ দিয়ে উদাহরণ অন্তর্ভুক্ত করার জন্য আপডেট করা উত্তরbasename
মাইকেল

ঠিক আছে, আমি দেখতে পাচ্ছি আপনি কি প্রস্তাব দিচ্ছেন তবে সমস্যা আছে বলে মনে হচ্ছে। আমার পাশাপাশি ডিরেক্টরিগুলিও বিবেচনা করা দরকার, কেবল ফাইলগুলি নয় (অর্থাত্- টাইপ চ)। এখন, যখন আপনি এখনও রেজিপক্স ব্যবহার করে নির্দিষ্ট ফাইলগুলি ছাঁটাই করতে পারেন find, তবে ইনপুটটিতে diffকোনও ডিরেক্টরি রয়েছে তবে এটি সেই ডিরেক্টরিতে ফাইলগুলির মধ্যে গিয়ে তুলনা করবে এবং এই ফাইলগুলির মধ্যে কিছু উপেক্ষা করা প্রয়োজন হতে পারে .... সুতরাং আপনি স্কয়ার 1 এ ফিরে যান
অ্যাশ

2

আমার একই সমস্যা ছিল তাই আমি একটি প্যাচ তৈরি করেছি diff। প্যাচটি এখনও গ্রহণযোগ্য নয়, তবে আপনি diffপ্যাচটির সাথে নিজের সংস্করণ তৈরি করতে পারেন বা একটি এআর প্যাকেজ সহ আর্চ লিনাক্সে ইনস্টল করতে পারেন

এখানে হয় diffপ্যাচ।


1

ডিরেক্টরি বাদ দিতে directory/sub-directory, আমি ব্যবহার করি

diff -r <src-dir> <dest-dir> | grep -v directory/sub-directory

তবে এটি একক বাদ দেওয়ার জন্য কাজ করা উচিত, আপনার যেমন রয়েছে তেমন দীর্ঘ অগ্রাহ্য করা তালিকার পক্ষে এটি সম্ভব হবে না।


-2
$ diff -rq foo.orig foo | grep -vP 'ignore1/|exclude2/' | awk '{print $2}' | cut -d'/' -f2- | xargs -I{} diff -u foo.orig/{} foo/{}

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