নন-এএসসিআইআই বা ফাইল-প্রিন্ট-অন-অক্ষরযুক্ত ফাইলগুলি সনাক্ত করুন


24

প্রায় 700০০,০০০ ফাইল সহ একটি ডিরেক্টরি আকারের ৮০ জিবিতে, ফাইলের নামে অ-ইংলিশ অক্ষর সহ কয়েকটি ফাইলের নাম রয়েছে। শ্রমসাধ্যভাবে ফাইলের তালিকায় ট্রলিং করা ছাড়াও এখানে রয়েছে:

  • এই ফাইলগুলির নাম তালিকাভুক্ত করার বা অন্যথায় সনাক্ত করার একটি সহজ উপায়?
  • মুদ্রণযোগ্য অ-ইংরাজী ভাষার অক্ষর উত্পন্ন করার উপায় - সেই অক্ষরগুলি যা মুদ্রণযোগ্য পরিসরে তালিকাভুক্ত নয় man ascii(তাই আমি কী পরীক্ষা করতে পারি যে এই ফাইলগুলি চিহ্নিত করা হচ্ছে)?

উত্তর:


32

ধরে নিই যে "বিদেশী" এর অর্থ "ASCII চরিত্র নয়", তারপরে আপনি findসমস্ত ফাইলের নামে মুদ্রণযোগ্য ASCII অক্ষর না থাকা সন্ধানের জন্য একটি প্যাটার্ন দিয়ে ব্যবহার করতে পারেন :

LC_ALL=C find . -name '*[! -~]*'

(স্থানটি http://www.asciable.com/ এ তালিকাভুক্ত প্রথম মুদ্রণযোগ্য অক্ষর , ~এটি সর্বশেষ)

এর জন্য ইঙ্গিতটি LC_ALL=Cপ্রয়োজনীয় (প্রকৃতপক্ষে LC_CTYPE=Cএবং LC_COLLATE=C), অন্যথায় অক্ষরের পরিসরটি ভুলভাবে ব্যাখ্যা করা হয়। ম্যানুয়াল পৃষ্ঠাটিও দেখুন glob(7)। যেহেতু স্ট্রিংগুলিকে ASCII হিসাবে ব্যাখ্যা করার LC_ALL=Cকারণ রয়েছে তাই findএটি বহু-বাইট অক্ষর (যেমন π) প্রশ্ন চিহ্ন হিসাবে মুদ্রণ করবে । এটি ঠিক করতে কিছু প্রোগ্রামে পাইপ (যেমন cat) বা ফাইলে পুনর্নির্দেশ করুন।

চরিত্রের ব্যাপ্তি নির্দিষ্ট করার পরিবর্তে, [:print:]"মুদ্রণযোগ্য অক্ষর" নির্বাচন করতেও ব্যবহার করা যেতে পারে। সি লোকেল সেট করা নিশ্চিত করুন বা আপনি বেশিরভাগ (আপাতদৃষ্টিতে) স্বেচ্ছাচারী আচরণ পান।

উদাহরণ:

$ touch $(printf '\u03c0') "$(printf 'x\ty')"
$ ls -F
dir/  foo  foo.c  xrestop-0.4/  xrestop-0.4.tar.gz  π
$ find -name '*[! -~]*'       # this is broken (LC_COLLATE=en_US.UTF-8)
./x?y
./dir
./π
... (a lot more)
./foo.c
$ LC_ALL=C find . -name '*[! -~]*'
./x?y
./??
$ LC_ALL=C find . -name '*[! -~]*' | cat
./x y
./π
$ LC_ALL=C find . -name '*[![:print:]]*' | cat
./x y
./π

1
সচেতন থাকুন যে আপনার কাছে এমন ফাইলের নাম রয়েছে যা বিদেশী অক্ষর সেটগুলি ব্যবহার করছে যা ইউটিএফ -8 বা এএসসিআইআইয়ের সাথে সঙ্গতিপূর্ণ নয়। এই ক্ষেত্রে, আপনি অক্ষরের পরিবর্তে প্রশ্ন চিহ্ন দেখতে পাবেন।
লেকেনস্টেইন

1
+1, তবে আমি LC_ALL=Cপরিবর্তে LC_COLLATE=Cএটি ব্যবহার করব কারণ এলসি_সিএলএলটি সেট করা ছাড়াই সিতে সেট করা LC_CTYPEএবং এলসি_এলএল ভেরিয়েবলটি পরিবেশে থাকা সত্ত্বেও এটি এখনও কার্যকর হয় তা নিশ্চিত করার জন্য এটি কোনও তাত্পর্যপূর্ণ নয় ।
স্টাফেন চেজেলাস

যদি SPCহয় মুদ্রণযোগ্য , তাহলে কি সম্পর্কে TABএবং LFএছাড়াও সাধারণত পাঠ্য ফাইল পাওয়া যায় কোনটি?
স্টাফেন চেজেলাস

1
ধন্যবাদ - এটি ছয়টি ফাইল খুঁজে পেয়েছিল, এতে দীর্ঘ হাইফেন, শর্ট হাইফেন এবং একক উদ্ধৃতির একটি বৈকল্পিক ছিল। এগুলি সমস্ত এমএস ওয়ার্ড থেকে উদ্ভূত হয়েছিল। LC_ALL এবং LC_COLLATE এর মধ্যে তালিকাভুক্ত ফাইলগুলির মধ্যে কোনও পার্থক্য নেই। এলসি_সিএলএলটি অ-এসসিআইআই অক্ষরগুলি সঠিকভাবে প্রদর্শিত হয়েছে যেখানে এলসি_এল প্রদর্শিত হয়েছে ??? পরিবর্তে. দুর্দান্ত উত্তর!
সন্দেহভাজন

1
স্টিফেনের পরামর্শের ভিত্তিতে উত্তরটি দিয়ে আমি আপডেট করেছি সুস্পেকটাস। জন্য LC_COLLATEএবং LC_CTYPE, এছাড়াও দেখুন find(1)র manpage।
লেকেনস্টেইন

6

যদি আপনি প্রতিটি ফাইলের নামটি tr -d '[\200-\377]'মূল নামের সাথে অনুবাদ করে তুলনা করেন, তবে যে কোনও ফাইলের নামের বিশেষ অক্ষর রয়েছে সেগুলি একই হবে না।

(উপরের দিক থেকে ধরে নেওয়া হচ্ছে যে আপনি বিদেশী সহ নন-এসএসআইআই মানে)


2
এটি সরিয়ে দেয় [এবং ]বেশিরভাগ trবাস্তবায়নেও।
স্টাফেন চেজেলাস

হ্যাঁ - এটি অপসারণ করেনি [এবং ]আমার সিস্টেমে।
সন্দেহভাজন

+1 টি - সমাধান অ হওয়া ASCII চিহ্ন আছে এমন সমস্ত (ছয়) ফাইলের নাম খুজে পেলে (ছাড়াও [এবং ]গুলি)। ধন্যবাদ।
সন্দেহভাজন

3

আপনি trকোনও ফাইলনাম থেকে যে কোনও বিদেশী চরিত্র মুছতে এবং ফলাফলটি মূল ফাইলের সাথে তুলনা করে দেখতে পারেন যে এটিতে বিদেশী অক্ষর রয়েছে।

find . -type f > filenames
while read filename; do
      stripped="$(printf '%s\n' "$filename" | tr -d -C '[[:alnum:]][[:space:]][[:punct:]]')"
      test "$filename" = "$stripped" || printf '%s\n' "$filename"; 
done < filenames

4
এটি আমার উত্তরের একটি সুন্দর এক্সটেনশন, তবে এটি খুব সহজ, ফাইলের নামগুলিতে সেগুলিতে নতুন লাইন থাকতে পারে এবং আপনার স্ক্রিপ্টটি কাজ করবে না
টিমো

1
আপনি পোস্ট প্রক্রিয়ার করতে চান, findআউটপুট, ব্যবহার যেমন দেখানো NUL-সমাপ্ত আউটপুট / ইনপুট এই উত্তর
লেকেনস্টেইন

0

গৃহীত উত্তর সহায়ক, তবে যদি আপনার ফাইলের নামগুলি ইতিমধ্যে LANG/ এ উল্লিখিত এনকোডিংটিতে থাকে LC_CTYPEতবে কেবল এটি করা ভাল:

LC_COLLATE=C find . -name '*[! -~]*'

চরিত্রের ক্লাসগুলি দ্বারা প্রভাবিত হয় LC_CTYPE, তবে উপরের কমান্ডটি অক্ষর শ্রেণিগুলি ব্যবহার করে না, কেবলমাত্র সীমাবদ্ধতা, তাই LC_CTYPEকেবল অস্বাভাবিক অক্ষরগুলিকে প্রশ্ন চিহ্ন দ্বারা প্রতিস্থাপন করা থেকে বিরত করে।

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