অবিচ্ছিন্নভাবে ভাঙা লিঙ্কগুলিতে আউটপুট ছাড়াই দুটি ডিরেক্টরিকে ডিফ-আরারের সাথে তুলনা করুন


38

আমি diff -r a bপুনরাবৃত্তভাবে ডিরেক্টরিগুলি এবং খ এর সাথে তুলনা করতে ব্যবহার করছি । এটা প্রায়ই ঘটে যদিও কিছু ছিন্ন লিঙ্কগুলি (উভয় একই ভাঙা লিঙ্ক আছে একটি এবং ডিরেক্টরি এবং একই, অ-বিদ্যমান লক্ষ্যমাত্রা নির্দেশিত)।

পরিবর্তন তারপর সেই ক্ষেত্রে এবং একটি নন-জিরো প্রস্থান কোড সহ প্রস্থানের জন্য আউটপুট ত্রুটি বার্তা অবশ্য আমি ডিরেক্টরি আমার বই একই এটা 0 দিয়ে নীরব থাকার, এবং প্রস্থান চাই।

আমি এটা কিভাবে করবো?


আপনি কি এখনও symlinks তুলনা করতে চান (এবং সমান তবে ভাঙা হিসাবে চিহ্নিত), বা এই ভিন্ন যখন এটি করা সমস্ত symlinks উপেক্ষা করা গ্রহণযোগ্য?
ire_and_curses

তুলনা করা এবং সমতুল্য হিসাবে চিহ্নিত, আমি সেগুলি ভাঙ্গা থাকলে পাত্তা দেয় না। আমি কেবল আমার আরএসসিএনসি কাজ করে যাচাই করার চেষ্টা করছি।
মার্কাস জুনিয়াস ব্রুটাস

উত্তর:


24

সংস্করণ ৩.৩ বা তার পরে এর জন্য diff, পিট হার্লানের উত্তরে--no-dereference বর্ণিত আপনার বিকল্পটি ব্যবহার করা উচিত ।

দুর্ভাগ্যক্রমে, পুরানো সংস্করণগুলি diff সিমলিঙ্কগুলি উপেক্ষা করে সমর্থন করে না :

কিছু ফাইল ডিরেক্টরি বা নিয়মিত ফাইল নয়: এগুলি প্রতীকী লিঙ্কগুলি, ডিভাইসের বিশেষ ফাইলগুলি, নামযুক্ত পাইপ এবং সকেটের মতো অস্বাভাবিক ফাইল। বর্তমানে, diffনিয়মিত ফাইলগুলির মতো প্রতীকী লিঙ্কগুলি আচরণ করে; এটি অন্যান্য বিশেষ ফাইলগুলিকে নিয়মিত ফাইলগুলির মতো আচরণ করে যদি সেগুলি শীর্ষ স্তরে নির্দিষ্ট করা থাকে তবে ডিরেক্টরিগুলির সাথে তুলনা করার সময় কেবল তাদের উপস্থিতি রিপোর্ট করে। এর অর্থ patchএমন ফাইলগুলিতে পরিবর্তনগুলি প্রতিনিধিত্ব করতে পারে না। উদাহরণস্বরূপ, আপনি যদি কোন ফাইলটিকে একটি প্রতীকী লিঙ্কটি নির্দেশ করেন diffতবে দুটি ফাইলের মধ্যে পার্থক্যকে প্রতীকী লিঙ্কের পরিবর্তে আউটপুট দেয়।

diffবিশেষভাবে বিশেষ ফাইলগুলিতে পরিবর্তনগুলি বিশেষত প্রতিবেদন করা patchউচিত এবং এই এক্সটেনশানগুলি বোঝার জন্য এটি বাড়ানো উচিত।

যদি আপনি যা চান তা হ'ল একটি rsync যাচাই করা (এবং সম্ভবত যা অনুপস্থিত রয়েছে তা স্থির করে), তবে আপনি কেবল দ্বিতীয়বারের মতো আরএসএনসি কমান্ড চালাতে পারবেন। আপনি যদি এটি না করতে চান তবে ডিরেক্টরিটি চেক-সংমিশ্রণ পর্যাপ্ত হতে পারে।

আপনি যদি এটির সাথে সত্যিই এটি করতে চান diff, তবে আপনি findসিমলিংকগুলি এড়িয়ে যেতে এবং প্রতিটি ফাইলের জন্য পৃথক পৃথকভাবে চালাতে পারেন। আপনার ডিরেক্টরিকে a এবং b আর্গুমেন্ট হিসাবে পাস করুন :

#!/bin/bash
# Skip files in $1 which are symlinks
for f in `find $1/* ! -type l`
do
    # Suppress details of differences
    diff -rq $f $2/${f##*/}
done

বা এক-লাইনার হিসাবে:

for f in `find a/* ! -type l`;do diff -rq $f b/${f##*/};done

এই ফাইল বিষয়বস্তুতে ভিন্ন বা ফাইল যা হয় শনাক্ত করবে একটি কিন্তু নেই

মনে রাখবেন যে:

  • যেহেতু আমরা symlinks সম্পূর্ণভাবে কুঁদন থাকে, তখন এই যদি সিমবলিক লিঙ্ক নামে উপস্থিত না লক্ষ্য করা হবে না । আপনি যে প্রয়োজনীয়, আপনি একটি দ্বিতীয় খোঁজ পাস হবে সব symlinks শনাক্ত করতে তারপর স্পষ্টভাবে তাদের অস্তিত্ব জন্য চেক
  • খ এর অতিরিক্ত ফাইলগুলি চিহ্নিত করা যাবে না, যেহেতু তালিকাটি এর বিষয়বস্তু থেকে তৈরি করা হয়েছে । এটি সম্ভবত আপনার rsyncদৃশ্যের জন্য কোনও সমস্যা নয় ।

প্রস্তাবিত স্ক্রিপ্টটি ডিরেক্টরি 'এ' (বি / for # f ## * using ব্যবহার করে 'বি' এর জন্য তৈরি পথগুলি সঠিক নয়) ডিরেক্টরিতে উপস্থিত কোনও ডিরেক্টরিতে পুনরাবৃত্তভাবে কাজ করে না।
মার্কাস জুনিয়াস ব্রুটাস

@ মার্কাসজুনিয়াস ব্রুটাস - হ্যাঁ, আপনি ঠিক বলেছেন। আমি মনে করি সমাধানটি # টি অপসারণ করা, যেমন for f in একটি / * সন্ধান করুন! টাইপ ঠ ;do echo $f b/${f#*/};done। আমার এখনই এটি পরীক্ষা করার সময় নেই I যদি এটি কাজ করে তবে আমাকে জানান।
ire_and_curses

এটা তোলে হয় ভাল কিন্তু এটি এখনও অনেক ক্ষেত্রে filepaths টা বাজিয়েছে। স্ক্রিপ্টটি (একটি # মুছে ফেলা) কাজ করার জন্য সরাসরি 'ক' এর উপরে ডিরেক্টরি থেকে আহ্বান করা দরকার বলে মনে হয়।
মার্কাস জুনিয়াস ব্রুটাস 21

জিএনইউ ডিফ ৩.৩ ব্যবহার করার সময় এই উত্তরটি অচল হয়ে যায় (নীচের পোস্টগুলি দেখুন)
বারান্দ গ্লস

প্রথমে সমস্ত ফাইলের নাম সন্ধান এবং প্রসারিত কমান্ড লাইনে তাদের খাওয়ানোর কারণে উপরের স্ক্রিপ্টটিতে বেশ কয়েকটি সমস্যা রয়েছে। (1) এটি কেবলমাত্র ফাইলের ছোট সংগ্রহের সাথে কাজ করবে। (২) বিশেষ অক্ষর (এমনকি একটি স্থান) সহ যে কোনও ফাইলের নাম প্রক্রিয়া করা হবে না। (৩) সর্বদা $(xxx)ব্যাকটিকের পরিবর্তে ব্যবহার করুন। ব্যাকটিক্স প্রতিসাম্য তাদের কম পঠনযোগ্য করে তোলে এবং বাসা বাঁধে। সংক্রান্ত 1 এবং 2 দেখুন stackoverflow.com/questions/11366184/...
Stéphane Gourichon

19

সংস্করণ ৩.৩ যেহেতু জিএনইউ diffপ্রতীকী সিমনলিঙ্কগুলি সমর্থন করে না, তবে তারপরে তারা যে পথগুলিকে নির্দেশ করেছে তার সাথে তুলনা করে।

GNU diffutils> = 3.3 ইনস্টল করুন এবং --no-dereferenceবিকল্পটি ব্যবহার করুন ; এর জন্য কোনও সংক্ষিপ্ত বিকল্প নেই।

সমান হলে বা ডায়াগনস্টিক চুপ থাকবে:

প্রতীকী লিঙ্ক /tmp/noderef/a/symlinkএবং /tmp/noderef/b/symlinkপৃথক


এখন কেবল যদি এটি সামগ্রীর পরিবর্তনগুলি দেখায় যেমন
সিমলিংক

6

আপনি এর একটি নতুন সংস্করণ ব্যবহার করতে পারেন diff

diffগনুহ মধ্যে diffutils3.3 একটি অন্তর্ভুক্ত --no-dereferenceকরে আপনি তার লক্ষ্যের চেয়েও symlinks নিজেদের তুলনা করতে বরং পারবেন বিকল্প। এটি তাদের পার্থক্য করা হয়েছে কিনা তা রিপোর্ট করে, তারা রাজি হলে নিরব এবং তারা ভেঙে গেছে কিনা সেদিকে খেয়াল রাখে না।

বিকল্পটি কখন যুক্ত হয়েছিল তা আমি জানি না; এটি 2.8.1 এ উপস্থিত নেই।


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