বাশ তারকা * ওয়াইল্ডকার্ড কি সর্বদা একটি সাজানো তালিকা তৈরি করে?


53

আমার কাছে ফাইলের সাথে একটি ডিরেক্টরি পূরণ রয়েছে logXXযেখানে XX দুটি অক্ষর, শূন্য-প্যাডযুক্ত, বড় হাতের সংখ্যা যেমন:

log00
log01
log02
...
log0A
log0B
log0C
...
log4E
log4F
log50
...

সাধারণত 20 বা 30 টি ফাইল মোট বলার চেয়ে কম হবে। আমার নির্দিষ্ট সিস্টেমে তারিখ এবং সময় এমন কিছু নয় যা নির্ভর করা যায় (নির্ভরযোগ্য এনটিপি বা জিপিএস সময় উত্সবিহীন এমবেডেড সিস্টেম)। তবে উপরে উল্লিখিত ফাইলের নামগুলি নির্ভরযোগ্যভাবে বৃদ্ধি পাবে।

আমি grepএকটি নির্দিষ্ট ধরণের একক সাম্প্রতিক লগ এন্ট্রির জন্য সমস্ত ফাইলের মধ্য দিয়ে যেতে চাই , আমি catফাইলগুলি একসাথে যেমন আশা করছিলাম ...

cat /tmp/logs/log* | grep 'WARNING 07 -' | tail -n1

তবে এটা আমার কাছে যে বিভিন্ন সংস্করণ ঘটেছে bashবা shবা zshইত্যাদি কিভাবে সম্পর্কে বিভিন্ন ধারণা থাকতে পারে *সম্প্রসারিত করা হয়।

man bashপৃষ্ঠা বলে না হোক বা না হোক সম্প্রসারণ *মিলে ফাইলের নামের একটি স্পষ্টভাবে আরোহী বর্ণানুক্রমিক তালিকা হবে। এটি আমার কাছে উপলব্ধ সমস্ত সিস্টেমে চেষ্টা করে দেখেছি বলে মনে হচ্ছে না - তবে এটি কি সংজ্ঞায়িত আচরণ বা কেবল বাস্তবায়ন নির্দিষ্ট?

অন্য কথায় আমি কি সম্পূর্ণরূপে cat /tmp/logs/log*আমার সমস্ত লগ ফাইল বর্ণানুক্রমিকভাবে একত্রিত করতে নির্ভর করতে পারি ?


1
@ এডিডিবি শেলটির জন্য ডিফল্ট সাজানোর ক্রমটি sortযখন কোনও ফাইল নাম গ্লোব্বিং প্যাটার্নকে প্রসারিত করে তখন একই রকম।
কুসালানন্দ

9
এটি ভয়ানক ফাইল নামকরণ অনুশীলন। আপনি লগ (0) = - ইনফটি দিয়ে আপনার রান কেন শুরু করবেন?
ইপি

14
@EP আমাদের ফাইল সিস্টেমটি একটি জটিল 7 ডাইমেনশনাল হাইপার-টরয়েড যার সাথে ইনোডের পরাবাস্ত্বিক সংখ্যায়ন রয়েছে। এটি ব্যস্তবক্সের কিছু অস্পষ্ট শাখার সাথে দাদাগিরি ছিল এবং আমরা এখন এটি আটকে
রেখেছি

1
আপনি এড়াতে পারেন catসঙ্গে grep -h pattern /tmp/logs/log*খেলাগুলিতে ফাইলের নামের prepending দমন করতে। (কমপক্ষে জিএনইউ গ্রেপ সহ, আমি পসিক্স বা ব্যস্তবক্সটি চেক করিনি))
পিটার কর্ডেস

1
@ কুসালানন্দ আপনি অব্যর্থ ব্যবহারের কথা শুনেছেন cat, এটি sort
বিড়াল

উত্তর:


52

সমস্ত শেলগুলিতে, গ্লোবগুলি ডিফল্ট অনুসারে বাছাই করা হয়। তারা ইতিমধ্যে/etc/glob 70 এর দশকের গোড়ার দিকে ইউনিক্সের প্রথম সংস্করণে গ্লোবগুলি প্রসারিত করার জন্য কেন টম্পসনের শেল নামে ডাকার সাহায্যকারী দ্বারা (এবং যা গ্লোবদের নাম দিয়েছিল) দ্বারা এসেছিল।

কারণ sh, পসিক্সের strcoll()মাধ্যমে সেগুলি বাছাই করা দরকার, এটি ব্যবহারকারীর লোকেলে বাছাইয়ের ক্রমটি ব্যবহার করছে যেমন lsকিছু এখনও এটির মাধ্যমে করে থাকে strcmp(), এটি কেবল বাইট মানগুলির উপর ভিত্তি করে।

$ dash -c 'echo *'
Log01B log-0D log00 log01 log02 log0A log0B log0C log4E log4F log50 log log lóg01
$ bash -c 'echo *'
log log log00 log01 lóg01 Log01B log02 log0A log0B log0C log-0D log4E log4F log50
$ zsh -c 'echo *'
log log log00 log01 lóg01 Log01B log02 log0A log0B log0C log-0D log4E log4F log50
$ ls
log  log  log00  log01  lóg01  Log01B  log02  log0A  log0B  log0C  log-0D  log4E  log4F  log50
$ ls | sort
log
log
log00
log01
lóg01
Log01B
log02
log0A
log0B
log0C
log-0D
log4E
log4F
log50

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

তবে আপনি লগ-লগের জন্য কিছু অসঙ্গতি লক্ষ্য করবেন ② এটি কারণ N এবং ② এর বাছাইয়ের ক্রমটি জিএনইউ লোকালগুলিতে সংজ্ঞায়িত হয়নি (বর্তমানে; আশা করি এটি কোনও দিন স্থির হয়ে যাবে)। তারা একই সাজান, যাতে আপনি এলোমেলো ফলাফল পেতে।

লোকেল পরিবর্তন করা বাছাইয়ের ক্রমে প্রভাব ফেলবে। একটি পছন্দ strcmp()মত সাজানোর জন্য আপনি লোকেলটি সিটিতে সেট করতে পারেন:

$ bash -c 'echo *'
log log log00 log01 lóg01 Log01B log02 log0.2 log0A log0B log0C log-0D log4E log4F log50
$ bash -c 'LC_ALL=C; echo *'
Log01B log-0D log0.2 log00 log01 log02 log0A log0B log0C log4E log4F log50 log log lóg01

মনে রাখবেন যে কিছু লোকেল অল-এএসসিআইআই অল-অ্যালাম স্ট্রিংয়ের জন্য এমনকি কিছু বিভ্রান্তি সৃষ্টি করতে পারে। চেকের মতো (কমপক্ষে জিএনইউ সিস্টেমে) যেখানে chএকটি কোলটিং উপাদান রয়েছে যা এর পরে সাজায়h :

$ LC_ALL=cs_CZ.UTF-8 bash -c 'echo *'
log0Ah log0Bh log0Dh log0Ch

বা, @ নিনজালজের দ্বারা উল্লেখ করা হয়েছে, এমনকি হাঙ্গেরীয় স্থানীয় লোকালগুলিতে এমনকি অযৌক্তিকরা:

$ LC_ALL=hu_HU.UTF-8 bash -c 'echo *'
logX LOGx LOGX logZ LOGz LOGZ logY LOGY LOGy

ইন zsh, আপনি গ্লোব কোয়ালিফায়ারগুলির সাথে বাছাই করতে পারেন । এই ক্ষেত্রে:

echo *(om) # to sort by modification time
echo *(oL) # to sort by size
echo *(On) # for a *reverse* sort by name
echo *(o+myfunction) # sort using a user-defined function
echo *(N)  # to NOT sort
echo *(n)  # sort by name, but numerically, and so on.

সংখ্যার সাজানোর ধরণের বিকল্পটি echo *(n)বিশ্বব্যাপী সক্ষম করা যেতে পারে numericglobsort:

$ zsh -c 'echo *'
log log log00 log01 lóg01 Log01B log02 log0.2 log0A log0B log0C log-0D log4E log4F log50
$ zsh -o numericglobsort -c 'echo *'
log log log00 lóg01 Log01B log0.2 log0A log0B log0C log01 log02 log-0D log4E log4F log50

আপনি যদি (যেমন আমি ছিলাম) সেই নির্দিষ্ট পরিস্থিতিতে এই আদেশটি দ্বারা বিভ্রান্ত হন (এখানে আমার ব্রিটিশ লোকাল ব্যবহার করছেন), বিশদ জন্য এখানে দেখুন।


1
'সিএইচ' কেসটি আরও উদ্বেগজনক হতে পারে: কিছু লোকেল সিদ্ধান্ত নিতে পারে যে 'সিএইচ', 'চ' এবং 'সিএইচ' প্রতিটি 1 টি কোলটিং উপাদান, যখন 'সিএইচ' দুটি সঙ্কোচনকারী উপাদান। দেখুন: unicode.org/cldr/trac/ticket/889 বর্তমান সিএলডিআর সম্পূর্ণরূপে সামঞ্জস্যপূর্ণ বলে মনে হচ্ছে না: বর্তমান হাঙ্গেরীয় ( ইউনিকোড.org / cldr / trac / browser / trunk / common / collation / hu.xML ) এর মতো নিয়ম রয়েছে &C<cs<<<Cs<<<CS, যখন &C<cs<<<cS<<<Cs<<<CSপ্রস্তাবিত পরীক্ষামূলক খসড়া হিসাবে চিহ্নিত করা হয়। সিএলডিআর আমদানি করা কিছু পুরানো ডেটা বিচার করে, পুরানো এআইএক্স এবং এমএসকে "ছোট হাতের অক্ষরটি বড়হীন 2 টি পৃথক কোলেশন উপাদান রয়েছে" ভিউ পছন্দ করে।
নিনজালজ

এবং আমি এমন সিস্টেমগুলি দেখেছি যেখানে এটি কোনওভাবেই কাজ করে না। :(
জোশুয়া

38

ব্যাশের জন্য ম্যান পৃষ্ঠাটি নির্দিষ্ট করে:

পথের নাম সম্প্রসারণ

শব্দ বিভাজন পর, যদি না -fবিকল্প সেট করা হয়েছে, ব্যাশ অক্ষরের জন্য প্রতিটি শব্দ স্ক্যান *, ?এবং [। যদি এই চরিত্রগুলির মধ্যে একটি উপস্থিত হয়, তবে শব্দটি একটি প্যাটার্ন হিসাবে বিবেচনা করা হবে, এবং প্যাটার্নের সাথে মিলে যাওয়া ফাইলের নামের সাথে বর্ণানুক্রমিক অনুসারে বাছাই করা তালিকা […] এর সাথে প্রতিস্থাপিত হবে।


1
পুটি বা manটেক্সট রেন্ডারিংয়ে সবেমাত্র একটি আকর্ষণীয় বাগ খুঁজে পেয়েছে ... আমি যে পাঠ্যটি অনুসন্ধান করছি তা যদি "শব্দ মোড়ানো" হয়ে যায় তবে / অনুসন্ধান আদেশটি এটি খুঁজে পাবে না। সবেমাত্র আমার টার্মিনালটি সর্বাধিক করা হয়েছে এবং এটি এখানে রয়েছে :)
ওয়াসনাম

2
আপনি coveredাকা bash। থো ওপি "zsh ইত্যাদি" সম্পর্কে আগ্রহী ছিলেন was
কুসালানন্দ

29

আপনি যদি কিছু শেলগুলিতে খুব নির্দিষ্ট শেল বিকল্পগুলি ট্রিগার না করেন তবে আউটপুট একই হওয়ার গ্যারান্টিযুক্ত।

অর্ডারটি পসিক্স স্ট্যান্ডার্ডে নির্দিষ্ট করা হয়েছে :

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

পসিক্স লোকালে LC_COLLATE বিভাগটিও দেখুন , যা সংক্ষেপে বলেছে যে, যদি LC_COLLATE=Cজিনিসগুলি ASCII ক্রমে অর্ডার করা হয়।


bashম্যানুয়াল উল্লেখ

LC_COLLATE

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

ksh93এবং zshএকটি অনুরূপ শব্দগুচ্ছ রয়েছে, যা আমাকে বিশ্বাস করতে পরিচালিত করে যে তারা এই বিষয়ে POSIX মান অনুসরণ করে।

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


2
এতে থাকা numericglobsortবিকল্পটি zshবাছাইয়ের উপর প্রভাব ফেলবে। যদিও আমি এটি echo *(n)বিশ্বব্যাপী বিকল্পটি চালু করার চেয়ে প্রতি গ্লোব ভিত্তিতে সক্ষম করব ।
স্টাফেন চেজেলাস

একটি নিটপিক ডিফল্ট মোডে বাশ, পিক্সিক্স-কমপ্লায়েন্ট নয়।
এফএমপুরফি

@ fpmurphy1 আরও বলুন।
কুসালানন্দ

@Kusalananda। পশিক্স-অভিযোগ হিসাবে বাশকে কখনই শংসাপত্র দেওয়া হয়নি। বাশ-এ "পসিক্স-কমপ্লায়েন্স" পেতে আপনার অবশ্যই --posixকমান্ড লাইন বিকল্পের set -o posix
সাহায্যে বাশকে

@ fpmurphy1 হ্যাঁ, তবে ফাইলনাম গ্লোব্বিং অক্ষরগুলির প্রসার বাছাই বাশের posixমোড দ্বারা প্রভাবিত হয় না । Gnu.org/software/bash/manual/html_node/Bash-POSIX-Mode.html দেখুন এটি আমাকে বিশ্বাস করতে পারে (আশা করি, বরং) যে বাছাই করা পজিক্স অনুগত।
কুসালানন্দ

1

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

(cd /tmp/logs; cat `ls -rt log*`) | grep whatever

এবং যদি ঘোরানো এবং সংকুচিত লগগুলিও জড়িত থাকে:

(cd /tmp/logs; zcat -f `ls -rt log*`) | grep whatever

4
এটি উল্লেখ করা হয়েছিল যে ফাইলগুলির টাইমস্ট্যাম্পগুলিতে বিশ্বাসযোগ্য নয়।
কুসালানন্দ

3
@ কুসালানন্দ, এটা ঠিক, আমাদের সিস্টেম সময়টি সাধারণত একটি এলোমেলো সংখ্যা জেনারেটর হিসাবে বিবেচিত হয় :)
উইসনেম
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.