ভিন্ন এনকোডিং সিস্টেম (উইন্ডোজ থেকে লিনাক্স) থেকে উচ্চারণযুক্ত অক্ষরগুলির সাথে ফাইলের নামগুলি সনাক্ত করতে বা গ্রেপ ব্যবহার করে


5

আমি আরও উত্তর ভাগ করে নেওয়ার জন্য স্ট্যাকওভারফ্লোতে খনি হিসাবে অনুরূপ একটি প্রশ্নে ( লিনাক্স ফাইল সিস্টেমে নন-ইউটিএফ 8 ফাইল নামগুলি সন্ধান করুন ) দেরিতে ট্যাগ করার চেষ্টা করেছি , সুতরাং এখানে আবার ...

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

সেখানে কি এমন কেউ আছেন যে ইউনিকোড এফএস বলে মনে হয় এমন নন-স্ট্যান্ডার্ড অক্ষর ধারণ করে এমন ফাইল নেমগুলির সন্ধানের জন্য কী বিকল্পগুলির সংমিশ্রণটি জানতে পারে, আমার ক্ষেত্রে অক্ষরগুলি ইউনিকোডের চেয়ে 8 বিট বাড়িয়ে দেওয়া বলে মনে হয়, ফাইলগুলি আসে একটি উইন্ডোজ মেশিন (আইসো -8859-1) এবং আমার নিয়মিত সেগুলি আনা দরকার। আমি কীভাবে খুঁজে পেতে এবং / অথবা গ্রেপ কনফ্যামের মতো একই কাজ করতে পারি তা দেখতে আগ্রহী।

নমুনা ফাইল:

> ls
Abcdef ÉÈéèáà-rest everest éverest

> ls -b
Abc\251def  ÉÈéèáà-rest  everest  éverest

প্রথম ফাইলটি উইন্ডোজ থেকে আসে (বা এর সাথে সিমুলেটেড touch $(printf "Abc\xA9def"))।

> find . -regex '.*[^a-zA-Z./].*'
./ÉÈéèáà-rest

> ls | egrep '[^a-zA-Z]'
ÉÈéèáà-rest

তাদের প্রায় সব হারিয়ে যাওয়া (হাইফেন সেই ফাইলটি সংরক্ষণ করেছে, রঙিন গ্রেপের সাথে দেখা যায়)। এখানে যা ঘটছে তা আমি প্রত্যাশা করি না তা নয়: সরবরাহ করা ব্যাপ্তির বাইরে থাকার কারণে একটিও উচ্চারণ করা চিঠিটি খুঁজে পেতে বা গ্রেপ করতে সক্ষম হয় না [^ a-zA-Z। /]।

> find . -regex '.*é.*'
./éverest
./ÉÈéèáà-rest

> ls | egrep 'é'
ÉÈéèáà-rest
éverest

> ls | egrep '[é]'
ÉÈéèáà-rest
éverest

> find . -regex '.*[é].*'
./éverest
./ÉÈéèáà-rest

উদ্ভটভাবে উভয়ই সরবরাহ করা হলে (পরিসীমা সহ) একটি মানক অ্যাকসেন্ট তুলতে সক্ষম হয়। Find xA9, \ 0251 বা \ o251 সহ কোনও সন্ধান বা গ্রেপ ট্রায়াল ব্যর্থ (কোনও মিল নেই)।

> ls | fgrep e
Abcdef
ÉÈéèáà-rest
everest
éverest

বিতর্কহীন চরিত্রের জন্য অনুসন্ধান করা সমস্ত ফাইল গ্রেপ সহ দেখায়, যেমনটি আমি প্রত্যাশা করতাম।

> find . -regex '.*e.*'
./éverest
./ÉÈéèáà-rest
./everest

> find . -name '*e*'
./éverest
./ÉÈéèáà-rest
./everest

সন্ধান করুন, তবে এটি খুব বৈষম্যমূলক: এমনকি একটি সাধারণ চরিত্রের সন্ধান করলেও আমার কাছে মনে হয় যে এটি ফাইলের নামগুলি সরিয়ে দেয় যা ফাইল সিস্টেমের নাম এনকোডিং স্কিমার জন্য গ্রহণযোগ্য অক্ষরের সীমার বাইরে অক্ষর ধারণ করে।

আমি যতদূর মনে করি যদি ফাইলটি ফাইল সিস্টেমে থাকে, তবে এটি সন্ধান করা উচিত, তাই না? তবে সম্ভবত এমন একটি বৈশিষ্ট্য আছে যা আমি জানিনা?

যে কোনও অন্তর্দৃষ্টি খুব প্রশংসা করা হবে।

উত্তর:


8

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

আপনার "সন্ধান করুন" কমান্ড লাইনে নিম্নলিখিত সংশোধন করে দেখুন:

LANG=C find . -regex '.*[^a-zA-Z./].*'

এটি কেবল "ফাইন্ড" কমান্ডের প্রসঙ্গে LANG পরিবেশের পরিবর্তনশীল সেট করে। যেহেতু "সি" ভাষার এনকোডিং কেবল ASCII সমর্থন করে তাই উচ্চারণযুক্ত বর্ণগুলি আর তাদের বেস অক্ষর হিসাবে বিবেচিত হবে না এবং তাই আপনার রেজেক্স দ্বারা সঠিকভাবে মিলে যাবে।


3
এটি চালানো LC_CTYPE=C find …বা আরও নির্ভরযোগ্য হবে LC_ALL=C find …। পরিবেশের পরিবর্তনশীলটির নজির LC_ALLপ্রথম, LC_xxxকাঙ্ক্ষিত লোকেল বিভাগের জন্য অনুপস্থিত থাকলে (এখানে সিটিপি, অর্থাত অক্ষর সেট এবং এনকোডিং), যদি অনুপস্থিত থাকে LANG। সুতরাং ইতিমধ্যে যদি আপনি LC_CTYPEপরিবেশে থাকেন (বিশ্বের 95% সাধারণ যাদের ভাষা ASCII তে লেখা যায় না) LANG=কোনও জিনিস পরিবর্তন করবেন না।
গিলস

5

জান্ডারের উত্তর পুরোপুরি কাজ করে, যারা এ থেকে আরও বেশি আগ্রহী তাদের জন্য, এখানে আরও একটি টিপস দেওয়া হয়েছে।

LANG = C দিয়ে, প্রশ্ন চিহ্ন সহ অ-অসি অক্ষর প্রদর্শন করে। সেই ফাইল সিস্টেমের সাহায্যে এটিকে আবার তাদের সাধারণ দর্শনে রূপান্তর করতে কেবল আউটপুটটিকে বিড়ালকে পাইপ করুন।

LANG=C find . -regex '.*[^a-zA-Z./-].*'
./??verest
./????????????-rest
./Abc?def

LANG=C find . -regex '.*[^a-zA-Z./-].*' | cat
./éverest
./ÉÈéèáà-rest
./Abcdef

1
আসলে যা চলছে তা হ'ল findঅপ্রিন্টযোগ্য অক্ষরগুলিকে রূপান্তর করে ?তবে কেবল এটি টার্মিনালে মুদ্রণ করা হয়। এর সাথে find … | cat, এটি কোনও টার্মিনালে মুদ্রণ করছে না সুতরাং এটি বাইটগুলি আসার সাথে সাথে মুদ্রণ করছে। সাথে LANG=C, প্রতিটি অ-এসসিআইআই অক্ষর ছাপিয়ে যায় না।
গিলস

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