केस-असंवेदनशील रहते हुए मैं पहली बार "एलएस" शो कैसे बना सकता हूं?


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आसानी से कार्यक्षमता को दोहराता नहीं है । जाहिर है, मैं उनमें से कुछ को एक फ़ंक्शन में लपेट सकता हूं, लेकिन इसमें कुछ विस्तृत कोड को शामिल करना होगा (जैसे) बिना तर्क के कैसे काम करना है / एक निर्देशिका के रूप में एक तर्क की आपूर्ति करना। या एक स्पष्ट -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 प्रतीकों जैसे लाइनों द्वारा परिभाषित कर रहे हैं

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

और वे लाइन की उपस्थिति द्वारा आदेशित हैं

<something-inside-angle-brackets>

मेरी कॉपी में iso14651_t1_common, पहली जगह का <RES-1>कोलाज़िंग सिंबल है , जो कि लाइन 3458 पर दिखाई देता है। यदि आप फ़ाइल अलग करते हैं, तो जो भी कोलिंग सिंबल का उपयोग करता है, उसे पहले ऑर्डर किया जाता है।

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


बेशक, आपको अपने dotfiles को देखने के लिए -a या -A को जोड़ना होगा, लेकिन जब तक आप हमेशा उन्हें देखना नहीं चाहते हैं, तब तक यह समझ में आता है कि कमांड लाइन पर, आपकी BASH स्क्रिप्ट में नहीं
बीप

प्रतिभाशाली! धन्यवाद, यह एकदम सही है! मैंने बस रूट-स्वामित्व वाली फ़ाइल को संशोधित किया है, इसलिए मैंने आपकी स्क्रिप्ट का परीक्षण नहीं किया। हालाँकि, मुझे लगता है कि आपको अपने आस-पास दोहरे उद्धरण चिह्नों की आवश्यकता है $@
स्पार्कवॉक

अच्छी कॉल - दोहरे उद्धरण जोड़े गए
बींड

11

; आप के बजाय खोल के सॉर्ट क्रम का उपयोग कर सकते हैं (जो वातावरण के मिलान के क्रम शामिल हो सकता है नहीं bash, एटी एंड टी ksh, yash, tcshऔर zshअपेक्षित परिणाम देने के लिए, mkshऔर dashनहीं है। fishएक मामले असंवेदनशील आदेश देने के लिए लगता है, लेकिन अलग-अलग परिणाम है जब वहाँ गैर- ASCII हैं देता है वर्ण):

ls -dUl -- .* *

यह lsफाइलों (और निर्देशिकाओं) की एक स्पष्ट सूची को सूचीबद्ध करने के लिए देता है, और lsछँटाई को निष्क्रिय -Uकरता है ( , जो कि एक GNU एक्सटेंशन है)।

आपके द्वारा उपयोग किए जा रहे शेल के आधार पर कुछ कैविएट हैं।

  • यदि zshडिफ़ॉल्ट nomatchनिर्देशिका में छिपी हुई और गैर-छिपी दोनों फ़ाइलें नहीं हैं , तो डिफ़ॉल्ट विकल्प के साथ कमांड विफल हो जाएगी; आप इससे nomatchबचने के लिए अक्षम हो सकते हैं , लेकिन बेहतर होगा कि set -o cshnullglobइसके बजाय (और कमांड केवल तभी विफल हो जाए जब कोई भी ग्लोब जैसे (t)cshया प्रारंभिक यूनिक्स गोले से मेल न खाए )।
  • के साथ zsh, pdkshऔर इसके व्युत्पन्न और fish, .*के विस्तार में शामिल नहीं है .और ..इसलिए, यह मेल खाता है ls -Al। अन्य गोले के साथ .और ..शामिल हैं इसलिए यह मेल खाता है ls -al। बाद के मामले में आपको ग्लोबिंग पैटर्न को बाहर करने .और ..( ls -dUl -- ..?* .[!.]* *) को बदलने की आवश्यकता होगी ।
  • को छोड़कर fish, (t)cshया zsh, यदि कोई भी गोलाकार पैटर्न कुछ भी मेल नहीं खाता है, lsतो त्रुटि संदेश उत्पन्न करेगा; आप की स्थापना करके या तो इस से बच सकते हैं nullglobविकल्प (में bashया zshकम से कम), या पुनः निर्देशित द्वारा stderrकरने के लिए /dev/null( ls -dUl -- ..?* .[!.]* * 2>/dev/null)। यदि आप उपयोग करते हैं nullglob, तो संभावित-आश्चर्यजनक व्यवहार के लिए बाहर देखो जो कारण बनता है ( शैल खाओ `?` अक्षर )। इसके साथ fishऐसा व्यवहार करता है कि जब इंटरैक्टिव, प्रत्येक ग्लोब के लिए एक चेतावनी संदेश जारी किया जाएगा जिसका कोई मिलान नहीं है।bashnomatch

( सभी प्रतिक्रिया के लिए स्टीफन चेज़ेलस के साथ धन्यवाद !)


ध्यान दें कि सभी शेल लोकेल के कोलाजेशन ऑर्डर का उपयोग करके सूची को सॉर्ट नहीं करेंगे। mkshऔर dashउदाहरण के लिए मामला असंवेदनशील नहीं होगा।
स्टीफन चेज़लस

1
ध्यान दें कि -U(बिना मतलब के) एक GNU एक्सटेंशन है। lsFreeBSD जैसे कुछ अन्य कार्यान्वयन हैं, -Uलेकिन यह बिना सूचीबद्ध सूची के लिए नहीं है।
स्टीफन चेज़लस

GNU के साथ ls, आपको --पहले की आवश्यकता है .*कि कार्यान्वयन तर्क के बाद विकल्प स्वीकार करता है (जब तक कि POSIXLY_CORRECT पर्यावरण में नहीं है)
स्टीफन चेज़लस

डरपोक (+1)! हालाँकि, मुझे यकीन नहीं है कि मैं इसे आसानी से सभी मामलों में उपयोग करूँगा, अर्थात एक उपनाम या फ़ंक्शन में। उदाहरण के लिए, यदि मुझे एक विशेष निर्देशिका को lsतर्क के रूप में निर्दिष्ट करना है तो उसे बदलना होगा ।
स्पार्कहॉक

1
@PeterCordes [!.]सही है। Pubs.opengroup.org/onlinepubs/9699919799/utilities/… देखें । कुछ (सबसे?) गोले नकारात्मक चरित्र वर्ग के ग्लोब के ^लिए एक पर्याय के रूप में अनुमति देते हैं !। किसी भी मामले में, मैं पसंद .[!.] .??* *करता हूं कि तुलना में थोड़ा अधिक .[!.]* ..?* *
समझदार हूं

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 वर्णमाला क्रम में।

उसी परिणाम को प्राप्त करने के लिए @StephenKitt उत्तर में सुधार किया जा सकता है:

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

+1 भी, लेकिन स्टीफनकिट के जवाब के अनुसार, मुझे यकीन नहीं है कि मैं इसे सभी मामलों में आसानी से उपयोग करूँगा, अर्थात उपनाम या फ़ंक्शन में। उदाहरण के लिए, यदि मुझे एक विशेष निर्देशिका को lsतर्क के रूप में निर्दिष्ट करना है तो उसे बदलना होगा । (FWIW मैं zsh का उपयोग कर रहा हूं, लेकिन यह बैश-लोगों के लिए उपयोगी है, मुझे लगता है।)
Sparhawk

-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
स्पर्हाक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.