কেন এলএস বাছাই করা অ-অক্ষরীয় অক্ষরগুলিকে উপেক্ষা করে?


25

ফাইলের নাম বাছাই করার সময়, lsপছন্দ মতো অক্ষরকে উপেক্ষা করে -,_। আমি প্রত্যাশা করেছি যে এটি অক্ষরগুলি বাছাইয়ের ক্ষেত্রেও ব্যবহার করবে।

একটি উদাহরণ:

touch a1 a2 a-1 a-2 a_1 a_2 a.1 a.2 a,1 a,2

এখন এই ফাইলগুলি এর সাথে প্রদর্শন করুন ls -1:

a1
a_1
a-1
a,1
a.1
a2
a_2
a-2
a,2
a.2

আমি যা প্রত্যাশা করছিলাম তা এই জাতীয় কিছু ছিল:

a1
a2
a,1
a,2
a.1
a.2
a_1
a_2
a-1
a-2

অর্থাত্ আমি বাছাই করার সময় অ-অক্ষর অক্ষরগুলি বিবেচনায় নেওয়ার প্রত্যাশা করেছি।

কেউ কি এই আচরণ ব্যাখ্যা করতে পারেন? এই আচরণটি কি কোনও মানদণ্ড দ্বারা বাধ্যতামূলক? অথবা এটি এনকোডিংটি ইউটিএফ -8 হওয়ার কারণে?

আপডেট: মনে হচ্ছে এটি ইউটিএফ -8 বাছাইয়ের সাথে সম্পর্কিত:

$ LC_COLLATE=C ls -1
a,1
a,2
a-1
a-2
a.1
a.2
a1
a2
a_1
a_2

2
ইউটিএফ -8 এবং এএসসিআইআই অভিন্ন যদি আপনি ব্যবহার করছেন সমস্ত প্রথম 128 কোডপয়েন্ট (যা আপনার উদাহরণ হিসাবে)। কি করলে কি হয় LC_COLLATE=C ls?
অ্যালেক্সিয়াস

সমস্যাটি এএসসিআইআই এবং ইউটিএফ -8 অভিন্ন নয়, এটি বরং এটি যে ইউটিএফ -8 এর নিজস্ব কোলেশন (বাছাই) নিয়ম রয়েছে।
ড্যানিয়েল কুলম্যান n

1
হ্যাঁ, এটি সত্য যে [_-,.]দলবদ্ধ করা হচ্ছে এবং কোনওভাবে আধা-উপেক্ষা করা হচ্ছে। আমি জানি না ঠিক কীভাবে বা কোথাও এই জাতীয় সংশ্লেষ সংজ্ঞায়িত করা হয়েছে, তবে এটি অবশ্যই একটি কোলেশন ইস্যু হতে হবে, কারণ কেবল এবং কেবলমাত্র কোলেশন সি (মাধ্যমে LC_COLLATE=C ls -l) পরিবর্তন করা আপনাকে প্রত্যাশিত সাজান অর্ডার দেওয়ার জন্য যথেষ্ট ( LC_ALLযেমন ধরে নেওয়া হচ্ছে ) ওভাররাইডিং নয় LC_COLLATE)। এটি ইউনিকোড বেসিক বহুভাষিক বিমানের সম্পূর্ণ পরিসরের অক্ষরের জন্য সত্য ... আমি আমার উত্তরটি সম্পাদনা করে একটি উদাহরণ স্ক্রিপ্ট অন্তর্ভুক্ত করতে যা এতে উপস্থিত রয়েছে ...
পিটার.ও

এটি কীভাবে কাজ করে তা আপনি যদি পছন্দ না করেন তবে আপনি একটি উপাত্ত তৈরি করতে পারেন এবং এটি আপনার ~ /। প্রোফাইলে রাখতে পারেন: ওরফে ls = 'LC_COLLATE = C ls' </kbd>
জিপ্পি

উত্তর:


10

চরসেটের সাথে এর কোনও যোগসূত্র নেই। বরং এটি সেই ভাষা যা মিলনের ক্রম নির্ধারণ করে। লিবিসি $LC_COLLATE/ $LC_ALL/ এ উপস্থাপিত ভাষাটি পরীক্ষা করে $LANGএবং এর কোলেশন বিধিগুলি (যেমন /usr/share/i18n/locales/*GLibC এর জন্য) সন্ধান করে এবং নির্দেশ অনুসারে পাঠ্যের আদেশ দেয়।


এফওয়াইআই: এটি এর চেয়ে জটিল। strcollউদাহরণস্বরূপ যদি কোনওটি ব্যবহার করা হয় তবে আপনি দেখতে পাবেন যে aasa.cউপরে কিছু সাজানো হবে aas.c
ডন স্কট 21

12

সম্পাদনা: LC_COLLATE = C এর সাথে বাছাই করা ডেটার জন্য পরীক্ষা যুক্ত করা হয়েছে


ডিফল্ট কোলিট ক্রম সেই "বিরামচিহ্ন-টাইপ" অক্ষরগুলিকে সমান মান হিসাবে Use LC_COLLATE=Cগণ্য করছে .. কোডপয়েন্টের ক্রমে তাদের চিকিত্সা করার জন্য ..

for i in 'a1' 'a_1' 'a-1' 'a,1' 'a.1' 'a2' 'a_2' 'a-2' 'a,2' 'a.2' ;do
  echo $i; 
done |LC_COLLATE=C sort

আউটপুট

a,1
a,2
a-1
a-2
a.1
a.2
a1
a2
a_1
a_2

নিম্নলিখিত কোডটি বেসিক বহুভাষিক প্লেনের সমস্ত বৈধ UTF-8 অক্ষর পরীক্ষা করে ( সরলতার জন্য \ x00 এবং \ x0a ; সর্বাধিকতার জন্য)
এটি একটি ফাইলকে তুলনামূলকভাবে উত্পন্ন (উত্পন্ন) ক্রমবর্ধমান ক্রমের সাথে তুলনা করে, সেই ফাইলটির সাথে এলোমেলোভাবে সাজানো এবং তারপরে আবার সাজানো হয় LC_COLLATE = সি। ফলাফলটি দেখায় যে সি সিকোয়েন্সটি মূল উত্পন্ন ক্রমের অনুরূপ।

{ i=0 j=0 k=0 l=0
  for i in {0..9} {A..F} ;do
  for j in {0..9} {A..F} ;do
  for k in {0..9} {A..F} ;do
  for l in {0..9} {A..F} ;do
     (( 16#$i$j$k$l == 16#0000 )) && { printf '.' >&2; continue; }
     (( 16#$i$j$k$l == 16#000A )) && { printf '.' >&2; continue; }
     (( 16#$i$j$k$l >= 16#D800    && 
        16#$i$j$k$l <= 16#DFFF )) && { printf '.' >&2; continue; }
     (( 16#$i$j$k$l >= 16#FFFE )) && { printf '.' >&2; continue; }
     echo 0x"$i$j$k$l" |recode UTF-16BE/x4..UTF-8 || { echo "ERROR at codepoint $i$j$k$l " >&2; continue; } 
     echo 
  done
  done
  done; echo -n "$i$j$k$l " >&2
  done; echo >&2
} >listGen

             sort -R listGen    > listRandom
LC_COLLATE=C sort    listRandom > listCsort 

diff <(cat listGen;   echo "last line of listOrig " ) \
     <(cat listCsort; echo "last line of listCsort" )
echo 
cmp listGen listCsort; echo 'cmp $?='$?

আউটপুট:

63485c63485
< last line of listOrig 
---
> last line of listCsort

cmp $?=0

2
সেই নথিটি কোথায়? এটি কি ইউনিকোড স্ট্যান্ডার্ডের অংশ?
ড্যানিয়েল কুলম্যান 27

2
আসলে, তারা একই মান পায় না; বাছাই করার সময় এই অক্ষরগুলি কেবল উপেক্ষা করা হয়। যদি তাদের সমান মান হিসাবে বিবেচনা করা হয়, তবে বাছাইয়ের ক্রমটি a_1 a2 a_2অসম্ভব।
ড্যানিয়েল কুলম্যান 27

আপনার কঠোর পরিশ্রম এবং নমুনা কোডের জন্য +1। পথের সাথে ম্যাচের জন্য বিরামচিহ্নের সাথে ডিরেক্টরি নামগুলি বাছাই করার পরে অনেক ঘন্টা পরে treeআমার মনে হয় গল্পের তুলনামূলক স্ট্রিং বা এ জাতীয় কিছু থেকে বিরামচিহ্ন অপসারণের মতো গল্পের আরও কিছু আছে। আমি বলতে পারি /চরিত্রটি কোলিং সিকোয়েন্সের সর্বনিম্ন চরিত্র হিসাবে সেট করতে হবে অন্য যাই হোক না কেন।
WinEunuuchs2Unix
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.