কোনও ফাইল কোনও সংশোধন না করেই সিআরএলএফ বা এলএফ ব্যবহার করে কিনা তা কীভাবে পরীক্ষা করবেন?


48

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

আমি যে স্ক্রিপ্টটি লিখছি তা বাশ-এ রয়েছে, সুতরাং আমি বাশের উপর ভিত্তি করে উত্তর পছন্দ করব।

উত্তর:


41

আপনি dos2unixফিল্টার হিসাবে ব্যবহার করতে পারেন এবং এর আউটপুটটিকে মূল ফাইলের সাথে তুলনা করতে পারেন :

dos2unix < myfile.txt | cmp -s - myfile.txt

2
খুব স্মার্ট এবং দরকারী, কারণ এটি সম্পূর্ণ ফাইলটি পরীক্ষা করে কেবল প্রথম বা কয়েকটি লাইনই নয়।
হলিউলিও

2
হতে পারে আপনি প্রতিস্থাপন করতে পারে testদ্বারা myfile.txtসঙ্গে এড়ানোর বিভ্রান্তির আপনার উদাহরণে দুইবার /usr/bin/test
পিটারিনো

1
-sআউটপুট দেখতে NB আপনার পতাকা মুছতে হবে । ম্যান পৃষ্ঠাগুলি থেকে: -s, --quiet, --silent suppress all normal output
টুবলার

24

লক্ষ্যটি যদি কেবল টাইমস্ট্যাম্পকে প্রভাবিত করে এড়ানো হয় তবে dos2unixএকটি -kবা --keepdateবিকল্প রয়েছে যা টাইমস্ট্যাম্পটিকে একই রাখবে। অস্থায়ী ফাইল তৈরি করতে এবং এটির পুনরায় নামকরণ করতে এটি লিখতে হবে তবে আপনার টাইমস্ট্যাম্পগুলি প্রভাবিত হবে না।

যদি ফাইলটির কোনও পরিবর্তন অগ্রহণযোগ্য হয় তবে আপনি এই উত্তরটি থেকে নিম্নলিখিত সমাধানটি ব্যবহার করতে পারেন ।

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

1
আপনি কি বলতে চাইছেন যে আপনি আক্ষরিক অর্থে সিআরএলএফ 4 অক্ষর সি, আর, এল এবং এফ লিখছেন?
বোড্যাসিডো

7
আপনি কি এও বোঝাতে চান যে গ্রেপ সিআর এবং এলএফ ঠিক একইভাবে নিতে পারে?
বোড্যাসিডো

@ বোড্যাসিডো এটি যে উত্তরটির সাথে লিঙ্ক করেছেন সে সম্পর্কে এটি ব্যাখ্যা করা হয়েছে, এবং এখন স্কট এর বার্টস-এর সম্পাদনাতেও এখানে ইউনিক্স.স্ট্যাকেক্সেক্সঞ্জ / আ / 70৯70০৮ /59 9 9৯৯ রয়েছে
dave_thompson_085 5

@ dave_thompson_085 আমি ব্যাখ্যা দেখতে পাচ্ছি না। এটি কেবল সিআরএলএফ উল্লেখ করেছে তবে এটি কী তা ব্যাখ্যা করে না।
বোড্যাসিডো

1
@bodacydo stackoverflow.com/questions/73833/... বলছেন যে find ... -exec file ... | grep CRLFডস লাইন শেষা w শ সহ একটি ফাইল (যেমন বাইট 0 দিন 0A) জন্য "আপনার মত কিছু পেতে হবে: ./1/dos1.txt: ASCII text, with CRLF line terminators যেহেতু আপনি দেখতে পারেন এই প্রকৃত স্ট্রিং CRLF রয়েছে এবং এর ফলে দ্বারা মেলানো হয় grepখুঁজছেন সাধারণ স্ট্রিং CRLF।
dave_thompson_085

22

আপনি grepসিআরএলএফ কোডের জন্য চেষ্টা করতে পারেন , অষ্টাল:

grep -U $'\015' myfile.txt

বা হেক্স:

grep -U $'\x0D' myfile.txt

অবশ্যই অনুমান যে এটি একটি পাঠ্য ফাইল is
এমডিপিসি

2
আমি এই grepব্যবহারটি পছন্দ করি কারণ এটি আমাকে ডিরেক্টরিতে এই জাতীয় সমস্ত ফাইল সহজেই তালিকাভুক্ত করতে grep -lU $'\x0D' *এবং আউটপুটটি পাস করতে দেয় xargs
মেলিবিয়াস

অনুসন্ধানের প্যাটার্নের আগে of এর অর্থ কী? @ ডন_ক্রিসটি
fersarr


21

যেহেতু সংস্করণ 7.1dos2unix একটি হয়েছে -i, --infoবিকল্প লাইন ব্রেক সম্পর্কে তথ্য পাবেন। কোন ফাইল রূপান্তর প্রয়োজন তা পরীক্ষা করতে আপনি নিজেই ডস 2 ইউনিক্স ব্যবহার করতে পারেন।

উদাহরণ:

dos2unix -ic *.txt | xargs dos2unix


13

প্রথম পদ্ধতি ( grep):

ক্যারেজ রিটার্ন সহ যে লাইনগুলি গণনা করুন:

[[ $(grep -c $'\r' myfile.txt) -gt 0 ]] && echo dos

ক্যারেজ রিটার্নের সাথে শেষ হওয়া লাইনগুলি গণনা করুন :

[[ $(grep -c $'\r$' myfile.txt) -gt 0 ]] && echo dos

এগুলি সাধারণত সমতুল্য হবে; একটি লাইনের অভ্যন্তরে একটি গাড়ীর ফিরে আসা (অর্থাত্ শেষ নয়) বিরল।

আরো দক্ষ:

grep -q $'\r' myfile.txt && echo dos

এটি আরও দক্ষ

  1. কারণ গণনাটিকে একটি ASCII স্ট্রিংয়ে রূপান্তর করতে হবে না এবং তারপরে সেই স্ট্রিংটিকে একটি পূর্ণসংখ্যায় রূপান্তর করতে হবে এবং এটি শূন্যের সাথে তুলনা করতে হবে এবং
  2. কারণ grep -cপুরো ফাইলটি পড়তে হবে, প্যাটার্নের সমস্ত উপস্থিতি গণনা করতে হবে, যখন প্যাটার্নটির grep -qপ্রথম ঘটনাটি দেখে বেরিয়ে যেতে পারেন।

নোট:

  • উপরের পুরোটি জুড়ে, আপনাকে -Uবিকল্পটি যুক্ত করতে হবে (যেমন, ব্যবহার -cUবা -qU), কারণ জিএনইউ grepঅনুমান করে যে ফাইলটি কোনও টেক্সট ফাইল কিনা। যদি এটি ফাইলটিকে পাঠ্য বলে মনে হয়, তবে এটি $নিয়মিত অভিব্যক্তিটি "সঠিকভাবে" কাজ করার প্রয়াসে লাইনের শেষ প্রান্তে গাড়ীর ফেরত অগ্রাহ্য করে - এমনকি যদি নিয়মিত প্রকাশ হয় \r$! নির্দিষ্ট করা -U(অথবা --binary) এই আন্দাজ overrules, যার ফলে grepঅক্ষত সি আর-শেষা w শ সঙ্গে ফাইল (গুলি) বাইনারি হিসাবে আচরণ এবং ধারণকৃত ম্যাচিং প্রক্রিয়া তথ্য পাস।
  • করবেন না grep … $'\r\n' myfile.txt, কারণ একটি নিদর্শন সীমানা হিসাবে grepআচরণ করে \ngrep -E 'foo|'লাইন fooবা নাল স্ট্রিং যুক্ত রেখাগুলি যেমন দেখায় তেমনি grep $'\r\n'লাইন \rবা নাল স্ট্রিং রয়েছে এবং প্রতিটি লাইন নাল স্ট্রিংয়ের সাথে মেলে।

দ্বিতীয় পদ্ধতি ( file):

[[ $(file myfile.txt) =~ CRLF ]] && echo dos

কারণ fileএমন কিছু রিপোর্ট করে:

myfile.txt: UTF-8 Unicode text, with CRLF line terminators

নিরাপদ বৈকল্পিক:

[[ $(file -b - < myfile.txt) =~ CRLF ]] && echo dos

কোথায়

সাবধান হন যে থেকে আউটপুটটি পরীক্ষা file করা কোনও অ-ইংরাজী লোকালে কাজ না করে।


1
আপনি "$(echo -e '\r')"অনেক সহজ দিয়ে প্রতিস্থাপন করতে পারেন $'\r', যদিও ব্যক্তিগতভাবে আমি $'\r\n'মিথ্যা ধনাত্মক সংখ্যা কমাতে ব্যবহার করব ।
রিচি

@rici grep $'\r\n'আমার সিস্টেম থাকা সব ফাইল মেলে বলে মনে হয় ...
depquid

@rici: ভাল ধরা। আপনার পরামর্শ অনুসারে আমি আমার উত্তর সম্পাদনা করেছি। - জালিয়াতি: সম্ভবত আপনি উইন্ডোজে আছেন? :-) রিচি এর টিপ এখানে কাজ করে।
বার্টস

@ ডিপকুইড (এবং বার্টস): আসলে, আমি মনে করি যে সঠিক অনুগ্রহটি দ্বিতীয়-অনুমানের লাইন- এন্ডিংয়ের চেষ্টা grep -U $'\r$'রোধ করা grep
রিচি

এছাড়াও, আপনি -qকোনও ম্যাচ পাওয়া গেলে কেবলমাত্র রিটার্ন কোড সেট করতে ব্যবহার করতে পারেন , পরিবর্তে -cঅতিরিক্ত চেক প্রয়োজন। ব্যক্তিগতভাবে আমি আপনার দ্বিতীয় সমাধানটি পছন্দ করি, যদিও এটি অত্যন্ত কৌতূহলের উপর নির্ভর করে fileএবং একটি অ-ইংরাজী লোকালে কাজ নাও করতে পারে।
ধনী

11

ব্যবহার cat -A

$ cat file
hello
hello

এখন এই ফাইলটি * এনআইএক্স সিস্টেমে তৈরি করা থাকলে এটি প্রদর্শিত হবে

$ cat -A file
hello$
hello$

তবে এই ফাইলটি যদি উইন্ডোজে তৈরি করা হত তবে এটি প্রদর্শিত হবে

$ cat -A file
hello^M$
hello

^Mউপস্থাপন CRএবং $প্রতিনিধিত্ব করে LF। লক্ষ্য করুন যে উইন্ডোজ শেষ লাইনটি সংরক্ষণ করে নিCRLF

এটি ফাইলের সামগ্রীগুলিও পরিবর্তন করে না।


সবচেয়ে ভাল এবং সহজ সমাধান! আরও বেশি ভোট দরকার
ব্যবহারকারী 648026

1
+1 এখনও সেরা উত্তর। কোনও নির্ভরতা নেই, জটিল বাশ স্ক্রিপ্ট নেই। শুধু -Aবিড়াল। cat -A file | lessফাইলটি খুব বড় হলে একটি টিপ ব্যবহার করা হবে। আমি নিশ্চিত যে একটি দীর্ঘ দীর্ঘ ফাইলের জন্য ফাইলের শেষগুলি পরীক্ষা করা অস্বাভাবিক নয়। ( qকম রাখার জন্য টিপুন )
নিকোলাস পিপিটোন

4

আপনার জন্য একটি বাশ ফাংশন:

# return 0 (true) if first line ends in CR
isDosFile() {
    [[ $(head -1 "$1") == *$'\r' ]]  
}

তারপরে আপনি স্টাফ এর মতো করতে পারেন

streamFile () {
    if isDosFile /tmp/foo.txt; then
        sed 's/\r$//' "$1"
    else
        cat "$1"
    fi
}

streamFile /tmp/foo.txt | process_lines_without_CR

3
আপনি ব্যবহার করতে হবে না isDosFile()আপনার উদাহরণে: streamFile() { sed 's/\r$//' "$1" ; }

1
আমি মনে করি এটি সবচেয়ে মার্জিত সমাধান; এটি পুরো ফাইলটি পড়ে না, কেবল প্রথম লাইন।
অ্যাডাম রাইজকোভস্কি

4

যদি কোনও ফাইলের ডস / উইন্ডোজ-স্টাইলের সিআর-এলএফ লাইন শেষ হয়, তবে আপনি যদি এটি ইউনিক্স-ভিত্তিক সরঞ্জাম ব্যবহার করে দেখেন তবে আপনি প্রতিটি লাইনের শেষে CR ('' r ') অক্ষর দেখতে পাবেন।

এই আদেশ:

grep -l '^M$' filename

প্রিন্ট হবে filenameযদি ফাইল উইন্ডোজ-শৈলী লাইন শেষা w শ সঙ্গে এক বা একাধিক লাইন রয়েছে, এবং কিছুই প্রিন্ট হবে যদি এটা না। ছাড়া যে ^Mএকটি আক্ষরিক গাড়ি ফেরত চরিত্র, সাধারণত টাইপ করে টার্মিনাল প্রবেশ করা হয়েছে Ctrl+ + Vদ্বারা অনুসরণ Enter (অথবা Ctrl+ + Vএবং তারপর Ctrl+ + M)। বাশ শেল আপনাকে $'\r'( এখানে ডকুমেন্টেড ) হিসাবে একটি আক্ষরিক ক্যারিজ রিটার্ন লিখতে দেয় , যাতে আপনি লিখতে পারেন:

grep -l $'\r$' filename

অন্যান্য শেলগুলি অনুরূপ বৈশিষ্ট্য সরবরাহ করতে পারে।

পরিবর্তে আপনি অন্য একটি সরঞ্জাম ব্যবহার করতে পারেন:

awk '/\r$/ { exit(1) }' filename

এই একটি অবস্থা সঙ্গে থেকে প্রস্থান করা হবে 1(সেটিং $?থেকে 1) যদি ফাইলটি কোন উইন্ডোজ-শৈলী লাইন শেষা w শ রয়েছে, এবং একটি স্থিতি সঙ্গে 0যদি এটা না, এটা একটা শেল দরকারী উপার্জন ifবিবৃতি (অভাব নোট [বন্ধনী ]):

if awk '/\r$/ { exit(1) }' filename ; then
    echo filename has Unix-style line endings
else
    echo filename has at least one Windows-style line ending
fi

কোনও ফাইলটিতে ইউনিক্স-স্টাইল এবং উইন্ডোজ-স্টাইলের লাইন শেষের মিশ্রণ থাকতে পারে। আমি এখানে অভিমানী করছি আপনি আছে ফাইল সনাক্ত করতে চান কোন উইন্ডোজ-শৈলী লাইন শেষা w শ।


1
$'\r'এই প্রশ্নের অন্যান্য উত্তরে উল্লিখিত হিসাবে আপনি টাইপ করে ব্যাশ (এবং কিছু অন্যান্য শেল) কমান্ড লাইনে একটি ক্যারেজ রিটার্ন এনকোড করতে পারেন ।
স্কট

2

ব্যবহার file:

$ file README.md
README.md: ASCII text, with CRLF line terminators

$ dos2unix README.md
dos2unix: converting file README.md to Unix format...

$ file README.md
README.md: ASCII text

পূর্ববর্তী দুটি উত্তরে এই ধারণাটি আরও অনেক পুঙ্খানুপুঙ্খভাবে আলোচনা করা হয়েছে।
জি-ম্যান

1

আমি ব্যবহার করা হয়েছে

cat -v filename.txt | diff - filename.txt

যা দেখে মনে হচ্ছে। আমি আউটপুটটি পড়ার চেয়ে একটু সহজ মনে করি

dos2unix < filename.txt | diff - filename.txt

আপনি যদি dos2unixকোনও কারণে ইনস্টল করতে না পারেন তবে এটি দরকারী ।

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