আপনি লিনাক্সে গ্রেপ সহ ডস লাইন এন্ডিংস (সিআরএলএফ) যুক্ত ফাইলগুলি কীভাবে অনুসন্ধান করবেন?


126

আমি লিনাক্সের গ্রেপ দিয়ে ডস লাইন এন্ডে থাকা ফাইলগুলি সন্ধান করতে চাই। এটার মতো কিছু:

grep -IUr --color '\r\n' .

উপরেরটি আক্ষরিকর সাথে মিলছে বলে মনে হচ্ছে rnযা পছন্দসই নয়।

এর আউটপুটটি জার্গাগুলির মাধ্যমে টুডোগুলিতে পাইপ করা হবে যাতে এ জাতীয় পছন্দটিকে এলএফতে রূপান্তরিত করতে পারে

grep -IUrl --color '^M' . | xargs -ifile fromdos 'file'

2
আপনি ডস 2 ইউনিক্স চেষ্টা করেছেন ? এটি স্বয়ংক্রিয়ভাবে লাইনের শেষগুলি ঠিক করে।
sblundy

আমি পুরোপুরি নিশ্চিত নই, তবে 'অভ্যন্তরের প্যাটার্নটি' এবং "উদ্ধৃতি দেওয়ার মধ্যে পার্থক্য রয়েছে Af 'পালানোর ক্রমগুলি যথাযথ স্ট্রিং হিসাবে ব্যাখ্যা করা হয়েছে সুতরাং' 'r'" \\ r "এবং" । r 'এর' এর সাথে কোনও সমতুল্য নয় (অন্ততপক্ষে সেই স্বরলিপিটিতে)
অ্যান্টিকোম

অ্যান্টিকোম: আপনি এক্ষেত্রে সঠিক যে 'এবং' এর মধ্যে পার্থক্য অপ্রাসঙ্গিক; তবে সাধারণত তারা 'পার্শ্বযুক্ত স্ট্রিংগুলি দুর্বলভাবে উদ্ধৃত হয় এবং "শক্তিশালী উদ্ধৃত হয় বলে এগুলি আলাদা। সবচেয়ে বড় জিনিসটি আমি গ্রহণ করি তা হ'ল দুর্বল উদ্ধৃত স্ট্রিংগুলিতে $ সম্প্রসারণ বা `expand প্রসারিত হয় না। আরও জানতে উদ্ধৃতি দেওয়ার জন্য ব্যাশ-হ্যাকারগুলি দেখুন।
bschlueter

4
স্যুইচ dos2unixসহ আধুনিক ব্যবহার করা সহজ উপায় -ic। এলএফ ফাইলগুলির জন্য আপনি ইউনিক্স 2 ডস দিয়ে অনুসন্ধান করতে পারেন -ic। এটি ফাইলগুলি পরিবর্তন করে না। শুধু রিপোর্ট।
gavenkoa

3
যেহেতু লিনাক্সে উইন্ডোজ লাইনের সমাপ্তি / ক্যারেজ রিটার্ন সম্পর্কিত কোনও প্রশ্নের এটি শীর্ষ প্রশ্নের উত্তর, আমি মনে করি এটি লক্ষ্য করার মতো যে আপনি কমান্ডটি দিয়ে টার্মিনালে তাদের দেখতে পাচ্ছেনcat -v somefile.txt ; তারা হিসাবে প্রদর্শিত হবে^M
user5359531

উত্তর:


121

আপনার গ্রেপ স্ট্রিংয়ে আক্ষরিক ক্যারেজ রিটার্ন অক্ষর প্রবেশ করতে Ctrl+ V, Ctrl+ ব্যবহার করুন M। তাই:

grep -IUr --color "^M"

কাজ করবে - যদি ^Mএমন কোনও আক্ষরিক সিআর থাকে যা আমার প্রস্তাব অনুসারে আপনি ইনপুট করেন।

আপনি যদি ফাইলগুলির তালিকা চান তবে আপনি -lবিকল্পটিও যুক্ত করতে চান ।

ব্যাখ্যা

  • -I বাইনারি ফাইল উপেক্ষা করুন
  • -Uসিআর অক্ষরগুলি ফেলাতে গ্রেপকে বাধা দেয়। এটি কোনও পাঠ্য ফাইলের সিদ্ধান্ত নিলে এটি ডিফল্টরূপে এটি করবে।
  • -r প্রতিটি ডিরেক্টরি অধীনে সমস্ত ফাইল পুনরাবৃত্তভাবে পড়ুন।

3
দ্রুত হ্যাক হিসাবে এটি কাজ করবে তবে আমি মনে করি মানব পাঠকের সমাধানটি হ'ল: গ্রেপ \ '\ আর' / বাশ শেল কেবল / বা printf '\r'
গ্রেপ

5
@akostadinov +1, কিন্তু ব্যাকটিক্স আপনার মন্তব্য থেকে ব্যাখ্যা করা যায়;) দ্বিতীয় বিকল্পটি, অন্য কথায়, হবে grep $(printf '\r')। তবে ব্যাশ জড়িত বেশিরভাগ ব্যবহারিক ব্যবহারের জন্য, আমি আটকে থাকব $'\r'
জানক

3
দ্রষ্টব্য: বিকল্পটি -Uউইন্ডোজের জন্য (বা সাইগউইন) কেবলমাত্র প্রাসঙ্গিক তবে এটি সেখানে সমালোচিত। উইন্ডোজে, কমান্ডটি এটি ছাড়া কাজ করবে না।
স্ল্যাসকে দিন

3
বিকল্প পয়েন্ট কি -I? ম্যানুয়াল দ্বারা, এটি আমার কাছে মনে হয় বাইনারি ফাইলগুলি অ-মিল হিসাবে বিবেচিত হয়। -Iএবং -U(যা বাইনারি ধরণের প্রয়োগ করে) এর সংমিশ্রণের ফলে সমস্ত ফাইল মিলবে না?
জোনিস এলমারিস

3
আপনি অ্যাড-অন বিকল্প হিসাবে '-l' পতাকাটি উল্লেখ করেছেন, তবে আমি মনে করি এটি প্রাথমিক উত্তরে অন্তর্ভুক্ত করা উচিত কারণ প্রশ্নটি মূলত ফাইলগুলির একটি তালিকা চেয়েছে। এছাড়াও, এটি দ্রুত অনুসন্ধানে ফলাফল দেয়।
arr_sea

168

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

find . -not -type d -exec file "{}" ";" | grep CRLF

আপনার মতো কিছু পাবেন:

./1/dos1.txt: ASCII text, with CRLF line terminators
./2/dos2.txt: ASCII text, with CRLF line terminators
./dos.txt: ASCII text, with CRLF line terminators

আমি ইতিমধ্যে এটি ক্র্যাক করেছি, তবে যাইহোক ধন্যবাদ। grep -IUrl --color '^M' . | xargs -ifile fromdos 'file'
টিম আবেল

5
গ্রেপ করতে -l বিকল্পটি এটি প্রতিটি ফাইলের মিলগুলি তালিকাভুক্ত না করে কেবল একবার (একবার) ফাইল তালিকাভুক্ত করতে বলে।
pjz

8
কোনও ভাল সমাধান নয়, প্রোগ্রামের (অনাবৃত, মানুষের ব্যবহারের দিকে ভিত্তি করে) আচরণের উপর নির্ভর করে file। এটা খুব ভঙ্গুর। (কেবল একটি) উদাহরণের জন্য: এটি এক্সএমএল ফাইলগুলির সাথে কাজ করে না , নিউলাইন টাইপের ক্ষেত্রে নির্বিশেষে fileপ্রতিবেদনগুলি XML document text
লিওনব্লয়

1
@ লেওনব্লয়, বিকল্পটি -m /dev/nullআমার find (GNU findutils) 4.4.2(উবুন্টু 12.04) এর উপর একটি ছোট হাতের আকার বলে মনে হচ্ছে ।
আর্লক্র্যাপস্টোন

8
আমার এই উত্তরটি সবচেয়ে ভাল লেগেছে। আমি find . -type f | xargs file | grep CRLF
সহজভাবেই

58

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

5
তাহলে কি এই বাশ-নির্দিষ্ট? এটি থাকলে তা লক্ষ করা উচিত।
কিউবস্প্ল 42

খারাপভাবে অটোক্রল্ফ সহ গিটের জন্য, আমি ব্যবহার করব: গ্রেপ-আইইউলজেড $ '\ আর' | xargs -0 sed -zbi 's / \ r // g'
বুজার্ড

16

যদি আপনার গ্রেপের সংস্করণ -P (--perl-regexp) বিকল্পটি সমর্থন করে , তবে

grep -lUP '\r$'

ব্যবহৃত হতে পারে.


8
# list files containing dos line endings (CRLF)

cr="$(printf "\r")"    # alternative to ctrl-V ctrl-M

grep -Ilsr "${cr}$" . 

grep -Ilsr $'\r$' .   # yet another & even shorter alternative

3

ক্যোয়ারীটি অনুসন্ধান ছিল ... আমার একটি অনুরূপ সমস্যা আছে ... কেউ সংস্করণ নিয়ন্ত্রণের সাথে মিশ্রিত লাইন এন্ডিং জমা দিয়েছে, সুতরাং এখন আমাদের কাছে 0x0d 0x0d 0x0aলাইন শেষের সাথে প্রচুর ফাইল রয়েছে । মনে রাখবেন যে

grep -P '\x0d\x0a'

সমস্ত লাইন খুঁজে পাওয়া যায়, যদিও

grep -P '\x0d\x0d\x0a'

এবং

grep -P '\x0d\x0d'

কোনও লাইন খুঁজে পাওয়া যায় না তাই যখন শেষের প্যাটার্নগুলির রেখাটি আসে তখন দুর্ভাগ্যক্রমে আমার জন্য গ্রেপের ভিতরে "অন্য কিছু" চলতে পারে!


3

আপনি ইউনিক্সে ফাইল কমান্ড ব্যবহার করতে পারেন। এটি আপনাকে লাইন টার্মিনেটরগুলির সাথে ফাইলের অক্ষর এনকোডিং দেয়।

$ file myfile
myfile: ISO-8859 text, with CRLF line terminators
$ file myfile | grep -ow CRLF
CRLF  

1

যদি আমার মতো, আপনার মিনিমালিস্ট ইউনিক্সে ফাইল কমান্ডের মতো সুন্দরতা এবং আপনার গ্রেপ এক্সপ্রেশনগুলিতে ব্যাকস্ল্যাশগুলি কেবল সহযোগিতা না করে তবে এই চেষ্টা করুন:

$ for file in `find . -type f` ; do
> dump $file | cut -c9-50 | egrep -m1 -q ' 0d| 0d'
> if [ $? -eq 0 ] ; then echo $file ; fi
> done

আপনি উপরেরগুলিতে যে পরিবর্তনগুলি করতে চান তা অন্তর্ভুক্ত:

  • আপনি যে ফাইলগুলি স্ক্যান করতে চান তা কেবল অনুসন্ধান করতে কমান্ডটি সন্ধান করুন ak
  • ডাম্প কমান্ডটি অড বা আপনার যে কোনও ফাইল ডাম্প ইউটিলিটিতে পরিবর্তন করুন
  • নিশ্চিত করুন যে কাট কমান্ডের মধ্যে উভয়ই শীর্ষস্থানীয় এবং চলমান স্থানের পাশাপাশি ডাম্প ইউটিলিটি থেকে হেক্সাডেসিমাল অক্ষর আউটপুট রয়েছে
  • দক্ষতার জন্য ডাম্প আউটপুটটিকে প্রথম 1000 অক্ষর বা তার মধ্যে সীমাবদ্ধ করুন

উদাহরণস্বরূপ, ডাম্পের পরিবর্তে ওড ব্যবহার করার জন্য এর মতো কিছু কাজ করতে পারে :

 od -t x2 -N 1000 $file | cut -c8- | egrep -m1 -q ' 0d| 0d|0d$'

1

dos2unix রূপান্তরিত হবে এমন ফাইলগুলি প্রদর্শন করতে ব্যবহার করা যেতে পারে এমন একটি ফাইল তথ্য বিকল্প রয়েছে:

dos2unix -ic /path/to/file

যাও recursively আপনি ব্যবহার করতে পারেন যে কাজের জন্য bashএর globstarবিকল্প, যা বর্তমান শেল সঙ্গে সক্রিয় করা হয় shopt -s globstar:

dos2unix -ic **      # all files recursively
dos2unix -ic **/file # files called “file” recursively

বিকল্পভাবে আপনি এটির findজন্য ব্যবহার করতে পারেন :

find -exec dos2unix -ic {} +            # all files recursively
find -name file -exec dos2unix -ic {} + # files called “file” recursively
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.