मैक ओएसएक्स में केस-असंवेदनशील एलएस छंटनी


30

मैं lsमैक्स ओएस एक्स लायन सॉर्ट फ़ाइलों और निर्देशिकाओं में कमांड कैसे बना सकता हूं, जैसे कि उबंटू लिनक्स कैसे करता है (केस-असंवेदनशील, निर्देशिका शीर्ष पर नहीं, डॉट फाइलें शीर्ष पर नहीं)? आदर्श रूप में मैं इस तरह के रूप में एक और आदेश के लिए उत्पादन पाइपिंग के बिना करना चाहते हैं।

उदाहरण के लिए, मैं देखना चाहता हूं:

foo
Foobar
MyStuff/
.stuff/
test.txt

के बजाय:

.stuff
Foobar
MyStuff/
foo
test.txt

लिनक्स में, lsसॉर्ट ऑर्डर विशेष रूप से सिस्टम के लोकेल द्वारा नियंत्रित किया जाता है LC_COLLATE। जब LC_COLLATE=en_US.UTF-8, जैसा मैं चाहता हूं, आइटम सॉर्ट करेगा। जब LC_COLLATE=C, lsOS X के समान होगा।

LC_COLLATEen_US.UTF-8ओएस एक्स में सेट किया गया है, लेकिन lsअभी भी पुराने POSIXतरीके से सॉर्ट करता है । क्या किसी को पता है कि मैं इसे कैसे लिनक्स की तरह व्यवहार कर सकता हूं?


यदि यह मदद करता है: Apple.stackexchange.com/a/22304/8546 देखती है कि एचएफएस प्लस आमतौर पर केस असंवेदनशील होने के लिए कॉन्फ़िगर किया गया है, लेकिन केस संरक्षण
ग्राहम पेरिन

जवाबों:


16

यह संभव नहीं हो सकता है:

Ls के लिए स्रोत कोड पर एक नज़र डालते हुए , यह फ़ाइल नाम को सॉर्ट करने के लिए strcoll का उपयोग करता है, और इसलिए LC_COLITATE का सम्मान करना चाहिए।

ऑनलाइन कुछ पोस्टिंग से पता चलता है कि बीएसडी (और डार्विन / ओएस एक्स) के स्थान लिनक्स की तुलना में कुछ हद तक टूटे हुए हैं। मैंने अपना खुद का एक त्वरित सॉर्टिंग कार्यक्रम लिखा है जो स्पष्ट रूप से स्थानीय है और इसे मेरी मशीन (मैक ओएस 10.6.3) और एक विश्वविद्यालय मशीन (लिनक्स, एफसी 11?) पर en_US.UTF-8 और C दोनों स्थानों का उपयोग करके परीक्षण किया है। जबकि लाइनिंग मशीन, ("ए बी सी" बनाम "बी ए सी") पर उम्मीद के मुताबिक काम करता है, मैक हमेशा उन्हें "बी ए सी" के रूप में सॉर्ट करता है।

स्रोत: http://ask.metafilter.com/130292/CaseInsensitive-LS-on-Mac-OS-X

मूल ANSWER

यह कमांड डॉट फाइल्स को सॉर्ट नहीं करता है, लेकिन अतिरिक्त डायरेक्टरी लिस्टिंग दिखाता है

ls -f1 

मैं इसके करीब पहुंच गया:

.
..
.stuff
foo
Foobar
MyStuff
test.txt

1
दिलचस्प है कि -f विकल्प के साथ "अक्षम प्रकार" वास्तव में अपेक्षा के अनुसार इसे क्रमबद्ध करता है। मुझे लगता है कि यह एक अधिक "प्राकृतिक" टकराव के साथ फाइलसिस्टम / एचएफएस + सॉर्टिंग प्रविष्टियां है।
गेरी

6

मुझे पता है कि यह उत्तर दिया गया है लेकिन यह मेरे लिए सबसे अच्छा काम करता है:

ls -f1 -alF -G

यह सभी विवरणों को सूचीबद्ध करता है और मामले की अनदेखी करके उन्हें हल करता है।


4

यह अब मुझे थोड़ी देर के लिए परेशान कर रहा है, और मैं आखिरकार इसे हल कर दिया (हेह)। उन सुझावों का एक गुच्छा आज़माने के बाद, जो काम नहीं किए, यहाँ क्या किया।

यदि आप MacPorts (या Homebrew, या फिंक) स्थापित करने के लिए तैयार हैं, तो ls का GNU संस्करण ठीक वही करता है जो आप चाहते हैं। मैं स्वयं MacPorts का उपयोग करता हूं, इसलिए मैं जो दृष्टिकोण समझाऊंगा:

  1. डाउनलोड करें और MacPorts स्थापित करें:

    http://www.macports.org

  2. GNU Coreutils पैकेज स्थापित करें:

    sudo port install coreutils

  3. अब आप जीएनयू ls होना चाहिए: gls। इसे उस निर्देशिका में आज़माएं जिसमें ऐसे आइटम हों जो अपरकेस और लोअरकेस अक्षरों से शुरू हों:

    gls -U

    ( -Uविकल्प का वास्तव में अर्थ है "अनसर्टेड", लेकिन ओएस एक्स पर जो इसे असंवेदनशील बनाने का वांछित प्रभाव है।)

  4. इस एलियास को अपने साथ जोड़ें .bash_profileताकि नियमित रूप lsसे आप जिस तरह से चाहते हैं वह काम करेगा (मुझे रंग आउटपुट पसंद है, लेकिन आप यह छोड़ सकते हैं कि यदि आप चाहते हैं; तो आपको केवल इसकी आवश्यकता है -U):

    alias ls='gls -U --color'

ध्यान दें कि -Uविकल्प शायद अन्य प्लेटफार्मों पर काम नहीं करेगा। ओएस एक्स में, यह हमेशा सही काम करने के लिए लगता है (शायद इसलिए कि एचएफएस + प्रभावी रूप से असंवेदनशील है - "केस-अवेयर", तकनीकी रूप से), लेकिन यदि आप इसे लिनक्स बॉक्स पर आजमाते हैं, तो परिणाम सबसे अधिक होने की संभावना है। सब पर छांटे गए।


1
3. नए APFS के कारण macOS> = 10.13 के तहत वांछित साइड-इफ़ेक्ट (-U विकल्प) नहीं लगता है।
Marius Hofert

1
हां ... ऐसा नहीं लगता कि APFS के साथ ऐसा करने का कोई तरीका है।
जेसन सिम्स

हालांकि पुष्टि 10.12 को काम करती है। धन्यवाद!
कर्नल पैनिक

4

ऊपर माइक ने जो लिखा है, उसे जोड़ते हुए, मैंने इसे थोड़ा आगे बढ़ाया है और अपने स्वयं के टकराव के नियमों को परिभाषित करने का एक तरीका पाया है।

लोकेल परिभाषाएँ / usr / शेयर / लोकेल / में स्थित हैं। प्रत्येक फ़ोल्डर एक लोकेल है और इसमें एक फ़ाइल (या लिंक) LC_COLLATE है, जो परिभाषित करता है कि कौन से प्रतीक "समान" हैं (उदाहरण के लिए, यू, यू और ü को ऑर्डर करते समय समान माना जाना चाहिए)। आप एक निर्देशिका की नकल कर सकते हैं और यह एक नई स्थानीय परिभाषा बनाएगा:

$ sudo cp -R en_GB.UTF-8/ en_GB.UTF-8-CI/

अब आपके पास 'en_GB.UTF-8-CI' (केस-असंवेदनशील के लिए 'CI') नामक एक नया स्थान होगा और आप LC_COLLATE का उपयोग कर सकते हैं।

अब, नए लोकेल में LC_COLLATE बदलने के लिए आप http://www.opensource.apple.com/source/adv_cmds/adv_cmds-119/usr-share-locate.tproj/colldef/ से लोकल सोर्स डाउनलोड कर सकते हैं , एक को संपादित करें आप चाहते हैं और चलाने के लिए निकटतम है

$ colldef < <new collation file>
$ sudo cp LC_COLLATE /usr/share/locale/en_GB.UTF-8-CI/

और अब जब तुम दौड़ोगे

$ LC_COLLATE=en_GB.UTF-8-CI ls

आप अपने नियमों के अनुसार छँटाई करेंगे ।

हां, यह वही है जो 'एलएस' को सॉर्ट केस-असंवेदनशील बनाने में लेता है।


2

वर्कअराउंड के रूप में आप एक फ़ंक्शन और एक उपनाम का उपयोग कर सकते हैं:

function lssorted() { /bin/ls "$@" | sort -f ;}
alias ls='lssorted'

यह मानक ls कमांड के लिए असंवेदनशील सॉर्ट किए गए आउटपुट का उत्पादन करता है।


1
मुझे ध्यान देना होगा: उदाहरण -l का उपयोग करने पर यह विफल हो जाएगा। फिर ls शुरुआत में एक और लाइन "टोटल एक्स" तैयार करता है, जिसे भी सॉर्ट किया जाएगा।
Arne

2

का उपयोग करते हुए

ls -f

मेरे लिये कार्य करता है।

-यदि आधिकारिक तौर पर किसी भी छँटाई को बंद कर दिया जाता है, लेकिन ऐसा लगता है कि तब मूल एचएफएस सॉर्ट चमकता है, जो वास्तव में एक केस-इन्सर्टिव प्रकार है।

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


यह निश्चित रूप से सही उत्तर है। इसके साथ एकमात्र मुद्दा यह है कि यह अंतर्निहित रूप से साथ ही -a को चालू करता है, और इसे बंद करने का कोई तरीका नहीं है, जो आपको एक अवधि के साथ शुरू होने वाली फ़ाइलों / फ़ोल्डरों को दिखाएगा, जिसमें शामिल हैं। तथा .. ।
लेंसोवेट

1
दूसरी समस्या (अब) यह है कि यह नए APFS के कारण macOS> = 10.13 के तहत काम नहीं करता है।
Marius Hofert

1

माइक के जवाब से प्रेरित होकर, मैंने निम्नलिखित को / etc / bashrc में जोड़ा, और यह Mojave में खूबसूरती से काम करता है। जब -a जोड़ा जाता है तो यह अंत में छिपी हुई फाइलों को सूचीबद्ध करता है, लेकिन यह मुझे परेशान नहीं करता है।

export LC_COLLATE="cs_CZ.ISO8859-2"; alias ls='ls -lhFG'

आप स्थानीय कमांड चलाकर नए कॉन्फ़िगरेशन को देख सकते हैं। वापस जाने के लिए, बस / etc / bashrc से लाइन निकालें और टर्मिनल में वापस लॉग इन करें।

$ locale
LANG="en_US.UTF-8"
LC_COLLATE="cs_CZ.ISO8859-2"
LC_CTYPE="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_ALL=

ध्यान दें कि Mojave में मेरे लिए न तो ls -f1 और न ही ls -f ने काम किया। मैं वास्तव में अनसोल्ड सूची के साथ समाप्त हुआ। केवल जो समाधान मैंने प्रदान किया है वह मेरे लिए मोजावे में काम करता है।


सबसे अच्छा जवाब है, लेकिन दिया गया उदाहरण बहुत अधिक है। इसे नीचे ट्रिम किया जाना चाहिए: निम्नलिखित पंक्ति को अपने .bashrcया .zshrc:alias ls="LC_COLLATE=cs_CZ.ISO8859-2 ls"
user1561489

0

चलाएँ:

$ type ls

आप शायद पाएंगे कि आपकी lsकमान अलियास है।


लिनक्स पर: ls is /bin/ls। ओएस एक्स पर ls is hashed (/bin/ls):। किसी भी तरह से, भले ही मैं /bin/lsसीधे कॉल करता हूं यह अभी भी LC_COLLATE के अनुसार सॉर्ट नहीं करता है।

2
यह आश्चर्य की बात है, मुझे लगता है कि आपके lsआदेश को शामिल करने के लिए उपनाम दिया गया था --group-directories-first। यह अभी भी कहीं और किया जा सकता है, सिर्फ एक उपनाम नहीं।
मिकीबी

0

यदि आप मुख्य रूप से डॉट फाइलों के क्रम के साथ संबंध रखते हैं, तो आप एक्सटेंशन के आधार पर छांट सकते हैं : विकल्प के साथ GNU फाइलुटिल्सls से कमांड का उपयोग करें । (आप मैकपोर्ट्स के माध्यम से जीएनयू फाइलुटिल्स स्थापित कर सकते हैं।)--sort=extension


0

ls LC_COLLATE के अनुसार छँटाई कर रहा है, यह सिर्फ इतना है कि सभी LC_COLLATE फाइलें केस सेंसिटिव सॉर्टिंग के लिए सेट हैं। http://collation-charts.org/fbsd54/

केस असंवेदनशील छँटाई के लिए दो सेट किए गए हैं: cs_CZ.ISO8859-2 और et_EE.ISO8859-15 et_EE.ISO8859.15 "Z" जिस तरह से अंग्रेजी बोलने वाले चाहते हैं, उसे सॉर्ट नहीं करता है। cs.CZ.ISO8859-15 वर्णमाला के साथ एक अच्छा काम करता है, मेरी इच्छा है कि यह वर्णमाला वर्णों से पहले "~" क्रमबद्ध हो।

मेरा समाधान है: LC_COLLATE = cs_CZ.ISO8859-2 / bin / ls -FG

मुझे आश्चर्य है कि अगर एक कस्टम LC_COLLATE फ़ाइल को संभालने के लिए बनाया जा सकता है "।" जिस तरह से आप चाहते हैं और "~" जिस तरह से मैं चाहता हूं।

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