ডিরেক্টরিতে একাধিক ফাইল কীভাবে পৃথক করবেন?


19

আমি diffএকটি ডিরেক্টরি দুটি কপি জুড়ে একই নামের সমস্ত ফাইলের মধ্যে গুলি চেষ্টা করার চেষ্টা করছি (একটি কাজ এবং একটি ব্যাকআপ বলুন)। উদাহরণস্বরূপ, আমি diffউভয় ক্ষেত্রে একই নামের দুটি ফাইল করতে পারি :

> diff d1/f.cpp d2/f.cpp

অথবা আমি ডিরেক্টরিতে পার্থক্য খুঁজে পেতে পারি:

> diff d1 d2

তবে আমি কীভাবে *.cppকেবল ফাইলগুলির মধ্যে পার্থক্য পেতে পারি ?

> diff d1/*.cpp d2/*.cpp

কাজ করে না বলে মনে হয় (স্পষ্ট কারণে)।

[লুপগুলি দিয়ে সমাধান করা সম্ভবত সহজ, তবে আমি আরও মার্জিত উপায় খুঁজতে চেষ্টা করছি]

উত্তর:


13

আপনি একটি শেল লুপ ব্যবহার করতে পারেন যা প্রতিটি ফাইলের জন্য পৃথকভাবে চালিত হয়, যদিও এটি ক্ষেত্রে ডি 2-তে একটি ফাইল রয়েছে তবে ডি 1 থাকে না। যদিও এটি যথেষ্ট হতে পারে।

for file in d1/*.cpp; do
    diff "$file" "d2/${file##*/}"
done

বা সমস্ত এক লাইনে:

for file in d1/*.cpp; do diff "$file" "d2/${file##*/}"; done

${file##*/}অংশ বিশেষ প্যারামিটার সম্প্রসারণ করা হয়।

যদি ফাইলের ভেরিয়েবলটি থাকে d1/hello.cppতবে তারপরে "${file##*/}"প্রসারিত হবে hello.cpp(ফাইলের মান, তবে সর্বশেষ / অপসারণ সহ সমস্ত কিছু সহ)।

সুতরাং "d2/${file##*/}"ফলাফল এবং ফলাফল পৃথক d2/hello.cppকমান্ড এইভাবে হয়diff d1/hello.cpp d2/hello.cpp

ব্যাশে স্ট্রিং ম্যানিপুলেশনগুলির জন্য আরও জানতে http://mywiki.wooledge.org/BashFAQ/100 দেখুন ।

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


আমি মনে করি যে দুটি দুর্দান্ত উত্তরের মধ্যে একাধিক ফাইলের প্রকারগুলি উপস্থিত থাকলে এটি আরও সোজা হয়ে যায় (যদিও আমি একটি নো-লুপ সমাধান খুঁজছি এমন প্রশ্নের মধ্যে উল্লেখ করেছি), তাই আমি এটি গ্রহণ করেছি। যোগ করা একটি যুক্ত হ'ল কমান্ডের echo "${file##*/}";আগে diff, সুতরাং যেগুলি আসলে ফাইলগুলি তুলনা করা হচ্ছে তা জানে। এছাড়াও, @ রিনজউইন্ডের উত্তরে উল্লিখিত হিসাবে, এই পদ্ধতিটি কেসটি কভার করে না তবে ফাইল তালিকা উভয় ডিরেক্টরিতে ঠিক একই রকম ছিল না।
ysap

52

diff -qr {DIR1} {DIR2} উভয় ডিরেক্টরিতে সমস্ত ফাইল করে।

  • q শুধুমাত্র পার্থক্য দেখায়
  • rপুনরাবৃত্তি করে। আপনার যদি প্রয়োজন না হয় তবে এটি ছেড়ে দিন

আপনি diffসরাসরি ওয়াইল্ডকার্ড ব্যবহার করতে বলতে পারবেন না তবে আপনি যোগ করতে পারেন:

-x PAT  --exclude=PAT
    Exclude files that match PAT.

-X FILE    --exclude-from=FILE
   Exclude files that match any pattern in FILE.

ফাইল বাদ দিতে। সুতরাং আপনি যদি চান *.cppতবে সবচেয়ে সহজ পদ্ধতিটি এমন একটি টেক্সট ফাইল তৈরি করা যা সমস্ত ফাইলগুলি তালিকাভুক্ত করে না *.cpp। আপনি নিম্নলিখিত কমান্ডটি দিয়ে এটি করতে পারেন: ls -I "*.cpp" > excluded_filesযেখানে -I "*.cpp"আর্গুমেন্ট সমস্ত .cpp ফাইলগুলিকে উপেক্ষা করে। উল্লেখ্য যে উদ্ধৃতি চিহ্নগুলি প্রয়োজনীয়।


সহজ, এবং নির্দোষভাবে কাজ করে।
হোসে

4

প্রশ্ন জিজ্ঞাসার কিছু সময় পরে, আমি পৃথক meldইউটিলিটিটি খুঁজে পেয়েছি এবং তখন থেকে এটি ব্যবহার করছি। এটি জিইউআই ভিত্তিক প্রোগ্রামের একটি দুর্দান্ত অংশ যা ফাইল এবং ডিরেক্টরিগুলির মধ্যে তুলনা এবং একত্রীকরণকে একটি খুব সহজ কাজ করে। এটি দ্বিগুণ বা তিন-উপায়ে তুলনা করে।

বিশেষত, এটি আমার আসল প্রশ্নের উত্তর দেয় যাতে এটি আপনাকে ডিরেক্টরি সামগ্রীর রঙ-কোডেড তুলনা দেখায় এবং আপনাকে ফাইলের নামের উপর ডাবল-ক্লিক করে নির্দিষ্ট ফাইলগুলি তুলনা করতে দেয়।

কারও যদি ত্রিমুখী তুলনার চেয়ে বেশি প্রয়োজন হয়, তবে gvimdiff( vimসম্পাদকের উপর ভিত্তি করে ) দুর্দান্তও রয়েছে যা এই কার্যকারিতাটি সরবরাহ করে।


1

এর জন্য একটি হালকা ওজনের সমাধান রয়েছে:

  1. এই ছোট প্লাগইনটি http://www.vim.org/scriptts/script.php?script_id=5309 সেট আপ করুন
  2. কি diff dir1 dir2 | vim -R -শেল এ

এটি পরিবর্তিত ফাইলগুলির জন্য ভাঁজ এবং পাশাপাশি পাশাপাশি তুলনা যুক্ত করবে।

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