ফাইলের শেষে নতুন লাইনের জন্য পরীক্ষা করা থেকে বিরত রাখুন


21

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

diff --ignore-all-space -r <dir1> <dir2>

এবং এই কাজ করছে। আমার সমস্যাটি হ'ল এটি অন্যান্য পার্থক্য (স্থান-সম্পর্কিত) উপেক্ষা করে, যা গুরুত্বপূর্ণ হতে পারে।

সংক্ষেপে বলা: আমি শুধু ফাইলের শেষে এ সম্পর্কে newline উপেক্ষা করতে চান। এটি দিয়ে কি সম্ভব diff?

উত্তর:


17

আপনাকে মূলত দুটি ফাইলের তুলনা করতে হবে, শর্তাধীনভাবে পিছনের বাইটটি উপেক্ষা করে। এটি করার জন্য কোনও 'ডিফ' বিকল্প নেই - তবে এটি করা যেতে পারে এমন অনেকগুলি উপায় রয়েছে (যেমন, হেক্সের পার্থক্যটি মনেও আসে))

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

উদাহরণস্বরূপ, নিম্নলিখিত কোনও ফাইলের বিষয়বস্তুগুলি ( sed -iস্থান পরিবর্তন করার জন্য ব্যবহার করুন , এটি নিখরচায় প্রিন্ট করুন) কোনও অনুপস্থিত থাকলে একটি নতুন লাইন যুক্ত করতে (বা ইতিমধ্যে একটি নতুন লাইন থাকলে ফাইলটি অপরিবর্তিত রেখে দিন):

sed -e '$a\'  file1.txt

এবং কেবল 'ডিফ' সিনট্যাক্স পর্যালোচনা করতে (সত্য প্রত্যাবর্তনের অর্থ তারা একই, মিথ্যা অর্থ ভিন্ন):

$ diff a/file1.txt   b/file1.txt  \
      && echo '** are same' || echo '** are different'
2c2
< eof
---
> eof
\ No newline at end of file
** are different

কেবল শ্বেত স্থানটি আলাদা কিনা তা যাচাই করুন:

$ diff --ignore-all-space  a/file1.txt   b/file1.txt \
     && echo '** are same' || echo '** are different'
** are same

বাশ-এ, আমরা ফাইলের বিষয়বস্তুগুলি 'ডিফ' (মূল ফাইলগুলি অপরিবর্তিত রেখে দেওয়া হয়েছে) ম্যানিটুলেট করতে 'সেড' ব্যবহার করতে পারি:

$ diff <(sed -e '$a\' a/file1.txt) <(sed -e '$a\' b/file1.txt) \
     && echo '** are same' || echo '** are different'
** are same

এখন আপনাকে যা করতে হবে তা হ'ল diff -rপুনরাবৃত্তির সাথে ডিরেক্টরিগুলির তুলনা করতে অনুকরণ করা। তাহলে ডিরেক্টরি তুলনা aএবং bসমস্ত ফাইল, তারপর a(যেমন, a/dir1/dir2/file.txtফাইল করার জন্য) আহরণ পথ b(যেমন, b/dir1/dir2/file.txt) এবং তুলনা করুন:

$ for f in $( find a -type f  )
> do
>    diff <(sed -e '$a\' $f) <(sed -e '$a\' b/${f#*/})
> done

আরও কিছুটা ভার্বোজ সংস্করণ:

$ for f in $( find a -type f  )
> do
>   f1=$f
>   f2=b/${f#*/}
>   echo "compare: $f1 $f2"
>   diff <(sed -e '$a\' $f1) <(sed -e '$a\' $f2) \
>       && echo '** are same' || echo '** are different'
> done && echo '** all are same' || echo '** all are different'
compare: a/file1.txt b/file1.txt
** are same
compare: a/file2.txt b/file2.txt
** are same
** all are same

আপনি কি দয়া করে ব্যাখ্যা করতে পারেন sed -e '$a\'ঠিক কি করে? thx
törzsmókus

sedনিম্নলিখিত ( -e) স্ক্রিপ্ট / এক্সপ্রেশন দিয়ে রান করুন যা ফাইলের ( $) এর শেষের সাথে মেলে এবং "অ্যাপেন্ড" ক্রিয়াটি (a \) সম্পাদন করে, তবে আসলে কোনও পাঠ্য নির্দিষ্ট করে না (`\ after এর পরে কিছুই নেই) এখনও ফাইলটির শেষের দিকে একটি ইওএফ / নিউলাইন যুক্ত করতে যাচ্ছে (কেবল এটি অনুপস্থিত থাকলে)।
মাইকেল 25 ই

ধন্যবাদ. আমি a\ এখনও দেখিনি ।
törzsmókus

1

আমি প্রতিটি ফাইলের জন্য একটি নতুন লাইন যুক্ত করে এবং ডিফ (বিকল্প -B) -এ ফাঁকা লাইন উপেক্ষা করে সমস্যার সমাধান করেছি । এই সমাধানগুলি আপনার ব্যবহারের ক্ষেত্রে উপযুক্ত নাও হতে পারে তবে এটি অন্যকে সহায়তা করতে পারে:

echo >> $FILE1 
echo >> $FILE2
diff -B $FILE1 FILE2 

0

diffকোনও grepকমান্ডের আউটপুটটি পাইপ করুন যা আপনি দেখতে চান না এমন বার্তাটি ড্রপ করে।


ভাল না. diff -r ফলাফলের সাথে উপস্থিত! = 0 যদি আমি --ignore-all-space যোগ না করি। পরিষ্কার হওয়ার জন্য: আমি ইওএফ এবং শুধুমাত্র ইওএফ এ নতুন লাইন উপেক্ষা করতে চাই f এবং আমি চাই যে এটি এই মানদণ্ডের সাথে মেলে এমন কোনও ফলাফলের প্রতিবেদন করুক। মানে, যদি গাছ ফাইল ফাইলের শেষে এ সম্পর্কে newline, যে একটি পার্থক্য বিবেচনা করা আবশ্যক শুধুমাত্র ভিন্ন, এবং এইভাবে পরিবর্তন 0. ফিরে আসবে
dangonfast

0

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

$ cmp  a/file1.txt  b/file1.txt  && echo '** are same' || echo '** are different'
cmp: EOF on b/file1.txt
** are different

$ du -b a/file1.txt  b/file1.txt 
13  a/file1.txt
12  b/file1.txt

$ cmp  -n 12 a/file1.txt  b/file1.txt  && echo '** are same' || echo '** are different'
** are same

ডিরেক্টরিতে থাকা সমস্ত ফাইলের উপরে লুপ করুন এবং দুটি ফাইলের জন্য একটি / ফাইল.txt এবং বি / ফাইল.txt, বড় ফাইলের আকার গণনা করুন এবং একটিকে বিয়োগ করুন, তারপরে cmpএই সংখ্যা বাইট ব্যবহার করে একটি বাইনারি ডিফ করুন ( ) এছাড়াও ব্যাশ):

(( bytes = $(du -b a/file.txt  b/file.txt  | sort -nr | head -1  | cut -f1) - 1 ))
cmp -n $bytes a/file.txt b/file.txt

ফাইল উপর looping অন্যান্য উত্তর ব্যবহারে হিসাবে একই হবে sedএবং diff


0

উত্তরটি সহজ।
অনুপস্থিত নতুন লাইনটি সম্পর্কে বার্তাটি আউটপুট প্রবাহে diffনয় ত্রুটি প্রবাহে। সুতরাং এটি নির্বানকে বাঁকুন এবং আপনি ভাল কাজ করেছেন

diff -rqEeB fileA fileB 2> /dev/null

ডিফ যদি একটি মান দেয়! = 0 যদি এটি পার্থক্য খুঁজে পায় এবং আমি সেই মানটি পরীক্ষা করতে চাই। / Dev / নাল এ পুনঃনির্দেশ করা পৃথক করে না যে পার্থক্যটি ভুলে যায়, সুতরাং প্রত্যাবর্তিত মানটি হয়! = 0, যা আমি চাই না। আমি ভিন্ন দুটি ফাইলকে সমান বিবেচনা করতে চাই যদি কেবলমাত্র পার্থক্যটিই শেষ নিউলাইন হয়
ড্যাংগনফস্ট

-1

ডিফ কমনাদে একটি পতাকা রয়েছে: --strip-trailing-crযা আপনি চেয়েছিলেন ঠিক তা করে


-1। আপনি কি এই চেষ্টা করেছেন? এটা তোলে একইরূপে /r/nমত /nএবং অতিরিক্ত সঙ্গে কিছুই করার আছে /nশুধু ফাইলের শেষে আগে।
কামিল ম্যাকিয়েরোভস্কি

আমি এটি চেষ্টা করেছি, এবং বিভিন্ন ডস / ইউনিক্স নিউলাইন দিয়ে ফাইলটি পৃথক করতে ব্যবহার করেছি ... এটি সঠিক না?
ধর্মান

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