সংবেদনশীল না হয়ে কীভাবে আমি প্রথমে "এলএস" ডটফাইলগুলি তৈরি করতে পারি?


21

একটি ডিরেক্টরিতে নিম্নলিখিত ফাইলগুলি তৈরি করুন।

$ touch .a .b a b A B 你好嗎

আমার ডিফল্ট lsঅর্ডার নেতৃস্থানীয় বিন্দুগুলির উপস্থিতি উপেক্ষা করে অন্যান্য ফাইলগুলির সাথে মিশে যায়।

$ ls -Al
total 0
-rw-r--r-- 1 sparhawk sparhawk 0 Jun  8 17:03 a
-rw-r--r-- 1 sparhawk sparhawk 0 Jun  8 17:03 .a
-rw-r--r-- 1 sparhawk sparhawk 0 Jun  8 17:03 A
-rw-r--r-- 1 sparhawk sparhawk 0 Jun  8 17:03 b
-rw-r--r-- 1 sparhawk sparhawk 0 Jun  8 17:03 .b
-rw-r--r-- 1 sparhawk sparhawk 0 Jun  8 17:03 B
-rw-r--r-- 1 sparhawk sparhawk 0 Jun  8 17:06 你好嗎

আমি প্রথমে ডটফাইলগুলি পরিবর্তন করতে পারি LC_COLLATE

$ LC_COLLATE=C ls -Al
total 0
-rw-r--r-- 1 sparhawk sparhawk 0 Jun  8 17:03 .a
-rw-r--r-- 1 sparhawk sparhawk 0 Jun  8 17:03 .b
-rw-r--r-- 1 sparhawk sparhawk 0 Jun  8 17:03 A
-rw-r--r-- 1 sparhawk sparhawk 0 Jun  8 17:03 B
-rw-r--r-- 1 sparhawk sparhawk 0 Jun  8 17:03 a
-rw-r--r-- 1 sparhawk sparhawk 0 Jun  8 17:03 b
-rw-r--r-- 1 sparhawk sparhawk 0 Jun  8 17:06 你好嗎

দুর্ভাগ্যক্রমে এটি বাছাই অর্ডার কে কেস-সংবেদনশীল করে তোলে, যেমন Aএবং Bপূর্ববর্তী aএবং b। কেস-সংবেদনশীল ( Aএবং aপূর্ববর্তী Bএবং b) থাকা অবস্থায় প্রথমে ডটফাইলগুলি মুদ্রণের কোনও উপায় আছে কি ?

সম্পাদনা করুন: LC_COLLATE সংশোধন করার চেষ্টা করা হচ্ছে

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

বিকল্পভাবে, আমি ভেবেছিলাম যে সম্ভবত LC_COLLATEএটি ব্যবহার করার চেয়ে আরও ভাল কিছু হতে পারে । যাইহোক, আমি যে কাজ করতে পারে বলে মনে হয় না। আমি বর্তমানে ব্যবহার করছি LC_COLLATE="en_AU.UTF-8"। আমি পরীক্ষা করেছিলাম /usr/share/i18n/locales/en_AU(যদিও আমি নিশ্চিত নই যে এটি সঠিক ফাইল কিনা, কারণ আমি এর কোনও উল্লেখ দেখতে পাচ্ছি না UTF-8); আমি নিম্নলিখিত খুঁজে পেয়েছি।

LC_COLLATE
copy "iso14651_t1"
END LC_COLLATE

/usr/share/i18n/locales/iso14651_t1রয়েছে copy "iso14651_t1_common"। অবশেষে, /usr/share/i18n/locales/iso14651_t1_commonরয়েছে

 <U002E> IGNORE;IGNORE;IGNORE;<U002E> # 47 .

আমি এই লাইনটি মুছে ফেলেছি, দৌড়েছি sudo locale-genএবং আমার কম্পিউটার পুনরায় চালু করেছি। দুর্ভাগ্যক্রমে, এটি কিছুই পরিবর্তন করেনি।

উত্তর:


11

ওপি সম্পাদনার সাথে খুব কাছাকাছি ছিল /usr/share/i18n/locales/iso14651_t1_common, তবে কৌশলটি লাইনটি মোছার নয়

<U002E> IGNORE;IGNORE;IGNORE;<U002E> # 47 .

বরং এটি পরিবর্তন করতে

<U002E> <RES-1>;IGNORE;IGNORE;<U002E> # 47 .

কেন এই কাজ করে

IGNOREবিবৃতিগুলিতে বর্ণিত হয় যে <U002E>শব্দগুলি বর্ণানুক্রমিকভাবে অর্ডার করার সময় পুরো স্টপ (ওরফে পিরিয়ড, বা চরিত্র ) উপেক্ষা করা হবে। আপনার ডটফাইলগুলি প্রথমে আসার জন্য, IGNOREঅন্য সমস্ত অক্ষরের আগে উপস্থিত একটি কোলাটিং প্রতীকটিতে পরিবর্তন করুন । কোলাটিং প্রতীকগুলি লাইনের দ্বারা সংজ্ঞায়িত করা হয়

collating-symbol <something-inside-angle-brackets>

এবং তারা লাইন উপস্থিতি দ্বারা আদেশ করা হয়

<something-inside-angle-brackets>

আমার অনুলিপিতে iso14651_t1_common, প্রথম স্থানের <RES-1>কোলটিং প্রতীকটি , যা 3458 লাইনে উপস্থিত রয়েছে you আপনি ফাইলটি আলাদা করেন তবে যে কোনও কলিং প্রতীকটি প্রথমে অর্ডার করা হয়েছে তা ব্যবহার করুন।

LC_COLLATE দিয়ে অক্ষর ক্রম সম্পর্কিত বিশদ

<U002E>তিনটি IGNOREবিবৃতি রয়েছে কারণ সম্পর্কের ক্ষেত্রে বর্ণগুলি একাধিকবার তুলনা করা যায়। এটি বুঝতে, ছোট হাতের অক্ষর aএবং বড় হাতেরটি বিবেচনা করুন A(যা চরিত্রের একটি গোষ্ঠীর অংশ যা আসলে চারবার তুলনা করে):

<U0061> <a>;<BAS>;<MIN>;IGNORE # 198 a
<U0041> <a>;<BAS>;<CAP>;IGNORE # 517 A

একাধিক রাউন্ড তুলনা থাকার ফলে "এ" এবং "এ" দিয়ে শুরু হওয়া ফাইলগুলি একসাথে গোষ্ঠীভুক্ত করার অনুমতি দেয় কারণ উভয়টি <a>প্রথম পাসের সময় যেমন অর্ডার নির্ধারণ করে তার সাথে তুলনা করা হয়। নীচের সমস্ত অক্ষর যদি একই হয় (যেমন a.txtএবং A.txt), তৃতীয় পাসটি a.txtপ্রথমে রাখবে কারণ ছোট হাতের অক্ষরের জন্য কোলাটিং প্রতীকটি <MIN>3467 লাইনে প্রদর্শিত হবে, বড় হাতের অক্ষরের জন্য আবদ্ধ প্রতীক<CAP> (লাইন 3488) এর আগে।

এই পরিবর্তনটি বাস্তবায়ন করা হচ্ছে

আপনি যদি কোনও প্রোগ্রাম ব্যবহারের মাধ্যমে চিঠিগুলি অর্ডার করার সময় প্রতিটি সময়কালের প্রথম সময় আসতে চান তবে LC_COLLATEআপনি iso14651_t1_commonউপরে বর্ণিত হিসাবে সংশোধন করতে পারেন এবং আপনার অবস্থানগুলির ফাইলটি পুনর্নির্মাণ করতে পারেন । কিন্তু আপনি এই পরিবর্তন করতে চান তাহলে শুধুমাত্র করতেls এবং মূল অ্যাক্সেস ছাড়া, আপনি মূল লোকেল ফাইল অন্য ডাইরেক্টরি তাদের পরিবর্তন করার আগে অনুলিপি করতে পারবেন।

আমি কি করেছিলাম

আমার ডিফল্ট লোকেল en_us, তাই আমি অনুলিপি করা হয়েছে en_US, iso14651_t1এবং iso14651_t1_commonকরতে $HOME/path/to/new/locales। আমি উপরিউক্ত পরিবর্তন প্রণীত iso14651_t1_commonএবং নতুন নামকরণ en_USকরা en_DOTFILE। এরপরে আমি en_DOTFILE লোকালটি সংকলিত করেছি

localedef -i en_DOTFILE -f UTF-8 -vc $HOME/path/to/new/locales/en_DOTFILE.UTF-8

ডিফল্ট lsক্রমটি প্রতিস্থাপন করতে, একটি BASH স্ক্রিপ্ট তৈরি করুন ls:

#!/bin/bash
LOCPATH=$HOME/path/to/new/locales LANG=en_DOTFILE.UTF-8 ls "$@"

/usr/binআপনার পথে আগে উপস্থিত এমন কোথাও এটি সংরক্ষণ করুন এবং এটি দিয়ে সম্পাদনযোগ্য করুন chmod +x ls


অবশ্যই, আপনার ডটফাইলগুলি দেখতে আপনাকে একটি -a বা -A যুক্ত করতে হবে, তবে আপনি যদি সর্বদা সেগুলি দেখতে না চান তবে আপনার BASH স্ক্রিপ্টে নয়, কমান্ড লাইনে এটি করা বোধগম্য হবে
beandip

উজ্জ্বল! ধন্যবাদ, এটি নিখুঁত! আমি কেবলমাত্র মূল-মালিকানাধীন ফাইলটি সংশোধন করেছি, তাই আমি আপনার স্ক্রিপ্টটি পরীক্ষা করিনি। যাইহোক, আমি মনে করি আপনাকে আপনার চারপাশে ডাবল কোট লাগানো দরকার $@
স্পারহাক

ভাল কল - ডাবল উক্তি যুক্ত
beandip

11

; আপনি পরিবর্তে শেল এর সাজানোর ক্রম ব্যবহার করতে পারেন (যা লোকেল এর কোলেশন অর্ডার যুক্ত থাকতে পারে না bash, যেমন AT & T ksh, yash, tcshএবং zshপ্রত্যাশিত ফলাফল দিতে, mkshএবং dashনা। fishএকটি মামলা অবশ অর্ডার দিতে, কিন্তু এটা ভিন্ন ফলাফল যখন নন- ASCII দেয় অক্ষর):

ls -dUl -- .* *

এটি lsতালিকার জন্য ফাইলগুলির (এবং ডিরেক্টরিগুলি) একটি স্পষ্ট তালিকা দেয় এবং lsএর বাছাইকরণ নিষ্ক্রিয় করে (-U যা একটি জিএনইউ এক্সটেনশন)।

আপনি যে শেলটি ব্যবহার করছেন তার উপর নির্ভর করে কয়েকটি ক্যাভেট রয়েছে।

  • এর সাথে zsh, ডিফল্ট nomatchবিকল্পটি কমান্ডটি ব্যর্থ করতে পারে যদি ডিরেক্টরিতে কোনও গোপন এবং অ গোপনীয় ফাইল থাকে না; আপনি nomatchএটি এড়াতে অক্ষম করতে পারেন , তবে তার set -o cshnullglobপরিবর্তে করণীয় ভাল হবে (এবং গ্লোবগুলির কোনওটির মতো না মিললে কমান্ডটি কেবল ব্যর্থ হবে to(t)csh ইউনিক্স শেলের )।
  • এর সাথে zsh, pdkshএবং এর ডেরাইভেটিভ এবং fish, .*এর সম্প্রসারণের অন্তর্ভুক্ত নেই .এবং .., সুতরাং এটি মেলে ls -Al। অন্যান্য শাঁস সঙ্গে .এবং ..অন্তর্ভুক্ত করা হয়, তাই এটি মিলে যায় ls -al। পরবর্তী ক্ষেত্রে আপনাকে বাদ দেওয়ার জন্য গ্লোব্বিং ধরণগুলি পরিবর্তন করতে হবে .এবং ..(ls -dUl -- ..?* .[!.]* * ) ।
  • ছাড়া fish, (t)cshঅথবা zsh, যদি globbing প্যাটার্নের কোনো কিছু মিলছে না, lsএকটি ত্রুটির বার্তা উত্পাদন করা হবে; আপনি সেট করে হয় আপনি এই এড়াতে পারেন nullglobবিকল্প (মধ্যে bashবা zshঅন্তত), অথবা পুনঃনির্দেশিত দ্বারা stderrকরা /dev/null( ls -dUl -- ..?* .[!.]* * 2>/dev/null)। আপনি যদি ব্যবহার করেন nullglobতবে সম্ভাব্য-আশ্চর্যজনক আচরণের জন্য সতর্ক থাকুন যার কারণ হয় ( শেল খাওয়া see ? `অক্ষর দেখুন )। ইন্টারঅ্যাকটিভ করার সময় এর সাথে fishআচরণ করে , যখন কোনও মিল নেই এমন প্রতিটি গ্লোবের জন্য একটি সতর্কতা বার্তা জারি করা হবে।bashnomatch

( সমস্ত প্রতিক্রিয়ার জন্য স্টাফেন চ্যাজেলাসকে ধন্যবাদ !)


নোট করুন যে সমস্ত শেল লোকালের কোলেশন অর্ডার ব্যবহার করে তালিকাটিকে বাছাই করে না। mkshএবং dashউদাহরণস্বরূপ কেস-সংবেদনশীলভাবে সাজান না।
স্টাফেন চেজেলাস

1
মনে রাখবেন -U(অরসেটেড বলতে বোঝানো) একটি জিএনইউ এক্সটেনশন। lsফ্রিবিএসডি এর মতো আরও কিছু বাস্তবায়নের একটি রয়েছে -Uতবে তা অরসেটেড তালিকার জন্য নয়।
স্টাফেন চেজেলাস

জিএনইউ দিয়ে lsআপনার --আগে প্রয়োজন .*যেমন বাস্তবায়ন যুক্তিগুলির পরে বিকল্পগুলি গ্রহণ করে (POSIXLY_CORRECT পরিবেশে না থাকলে)
স্টাফেন চ্যাজেলাস

স্নিগ্ধ (+1)! তবে, আমি নিশ্চিত নই যে আমি কীভাবে এটি সমস্ত ক্ষেত্রে, যেমন কোনও কোনও নাম বা ফাংশনে সহজেই ব্যবহার করব। উদাহরণস্বরূপ, আমি lsযুক্তি হিসাবে একটি নির্দিষ্ট ডিরেক্টরি নির্দিষ্ট করতে চাইলে এটি পরিবর্তন করতে হবে ।
স্পারহাক

1
@ পিটারকর্ডস [!.]সঠিক। Pubs.opengroup.org/onlinepubs/9699919799/utilities/… দেখুন । কিছু (সবচেয়ে?) শেল অবহেলিত চরিত্র শ্রেণীর গ্লোবগুলির ^প্রতিশব্দ হিসাবে অনুমতি দেয় !। যাই হোক না কেন, আমি .[!.] .??* *তার চেয়ে কিছুটা বেশি বোধগম্য হওয়া পছন্দ করি.[!.]* ..?* *
jrw32982 মনিকা

4

আপনি কেবল দুটি পৃথক lsকমান্ড ব্যবহার করতে পারেন :

$ ls -dl ..?* .[^.]* 2>/dev/null ; ls -dl *
-rw-r--r--. 1 sparhawk sparhawk 0  8 Jun  09:29 .a
-rw-r--r--. 1 sparhawk sparhawk 0  8 Jun  09:29 .b
-rw-r--r--. 1 sparhawk sparhawk 0  8 Jun  09:29 a
-rw-r--r--. 1 sparhawk sparhawk 0  8 Jun  09:29 A
-rw-r--r--. 1 sparhawk sparhawk 0  8 Jun  09:29 b
-rw-r--r--. 1 sparhawk sparhawk 0  8 Jun  09:29 B
-rw-r--r--. 1 sparhawk sparhawk 0  8 Jun  09:29 你好嗎

এখনও অবধি অন্যান্য উত্তরগুলির মতো নয়, এই পদ্ধতির মাধ্যমে প্রথমে ডট ফাইলগুলি এন্ট্রিগুলি .এবং ..এন্ট্রিগুলি এড়ানো হবে এবং তারপরে অবশিষ্ট ls বর্ণগুলি বর্ণানুক্রমিক ক্রমে প্রদর্শন করা হবে।

@ স্টেফেনকিট উত্তরের একই ফলাফল অর্জন করার পরেও উন্নতি করা হতে পারে:

$ ls -dUl ..?* .[^.]* * 2>/dev/null

+1ও, তবে স্টিফেনকিটের উত্তর অনুসারে, আমি নিশ্চিত নই যে আমি কীভাবে এটি সমস্ত ক্ষেত্রে, যেমন কোনও কোনও নাম বা ফাংশনে ব্যবহার করব। উদাহরণস্বরূপ, আমি lsযুক্তি হিসাবে একটি নির্দিষ্ট ডিরেক্টরি নির্দিষ্ট করতে চাইলে এটি পরিবর্তন করতে হবে । (এফডাব্লুআইডাব্লু আমি জেডএস ব্যবহার করছি, তবে এটি বাশ-লোকের জন্য দরকারী, আমি মনে করি।)
স্পারহক

-2

আপনি খেলতে পারেন ls কমান্ড অপশন । এটা চেষ্টা কর:

# ls -laXr

কোথায়:

-l     use a long listing format
-a, --all
              do not ignore entries starting with .
-X     sort alphabetically by entry extension
-r, --reverse
              reverse order while sorting

দুঃখিত, আমি যা চাই তা তা মনে হয় না। -Xপতাকা পর এক্সটেনশান দ্বারা বাছাই করে ., যা সম্পূর্ণই ভিন্ন। এছাড়াও, ফাইলগুলি বিপরীত বর্ণানুক্রমিক ক্রমে রয়েছে। এছাড়াও, যখন ডটফাইলগুলি আমার উদাহরণের জন্য প্রথম, এটি সব ক্ষেত্রে কার্যকর হবে না (যেমন a.b c.d .a .c)। এছাড়াও, আপনি এর -aপরিবর্তে ব্যবহার করেছেন -A
স্পারহক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.