मैं पहले अक्षर अंडरस्कोर वर्णों को कैसे बनाऊं?


20

मैं एक अंडरस्कोर उपसर्ग के साथ फ़ाइलों और निर्देशिकाओं को नाम देने में सक्षम होना पसंद करता हूं यदि यह कुछ ऐसा है जिसे मैं उसी स्तर पर अन्य फ़ाइलों और निर्देशिकाओं से अलग रखना चाहता हूं। उदाहरण के लिए, विंडोज और मैक पर, एक अंडरस्कोर के साथ एक फाइल को प्रीफ़िक्स करना, इसे अल्फ़ान्यूमेरिक वर्ण से शुरू होने वाली फ़ाइलों के सामने, शीर्ष पर सॉर्ट करता है।

मेरी गुगली बदल गई है कि उसे LC_COLLATE और मेरे वर्तमान लोकेल (en_US) के साथ क्या करना है। यह ठीक है, हालांकि मुझे वास्तव में समझ नहीं आया कि en_US अपेक्षा के अनुरूप क्यों नहीं छांटता है।

ICU Collate प्रदर्शन साइट के आधार पर वातावरण को en_US_POSIX पर सेट करने से निश्चित रूप से उस क्रम का पता चल रहा है जिसकी मुझे तलाश है (आपको नमूना डेटा को संपादित करना होगा और इसे जांचने के लिए कुछ अंडरस्कोर जोड़ना होगा)। लेकिन मैं वास्तव में यह नहीं देखता कि इसे अपने लिनक्स शेल में कैसे लागू किया जाए।

आदर्श रूप से, मैं अपने bash config में कुछ सेट करने में सक्षम होना चाहूंगा ताकि ls हमेशा पहले अंडरस्कोर करें। मैं ऐसा कैसे कर पाऊंगा?


मैं ICU Collate का उपयोग चूक के साथ या en_US_POSIX.txt के साथ "लोकेल के लिए फ़ेच नियम" के माध्यम से नहीं कर सकता। क्या आप अपने द्वारा उपयोग की गई सेटिंग्स को समझा सकते हैं?
मिकेल

इसी तरह के सवाल पूछते हैं ububuntu.com/questions/47702/…
मिकेल

@ मैं ऊपर दिए गए लिंक का उपयोग कर रहा हूं, परीक्षण डेटा में कुछ अंडरस्कोर जोड़ें और फिर सॉर्ट के परिणाम देखने के लिए सबमिट करें।
टॉम ऑर्नर

ठीक यही मैंने किया, और अंडरस्कोर से शुरू होने वाले तार शुरुआत के बजाय बीच में हल हो जाते हैं, जैसे कि अंडरस्कोर नहीं थे।
मिकेल

1
एक संबंधित प्रश्न, जो वास्तव में टकराव के आदेश की परिभाषा को बदल रहा है, वह है unix.stackexchange.com/questions/421h8
जेडीबीपी

जवाबों:


5

यदि आप अपने lsइच्छित तरीके को क्रमबद्ध नहीं कर पा रहे हैं, तो शेल विस्तार का प्रयास करें।

आप फ़ाइल नाम पैटर्न का उपयोग lsफ़ाइलों की एक सूची के साथ चलाने के लिए कर सकते हैं जो शेल पहले से ही सॉर्ट किया गया है, जो विधि का lsउपयोग करता है।

ls -lf _* [!_]*

मान लें कि आपके पास फ़ाइलें हैं

_a a _b b _c c

यह दौड़ने जैसा है

ls -lf _a _b _c a b c

स्पष्टीकरण:

_* एक शेल पैटर्न है जो किसी भी फ़ाइल नाम से मेल खाता है जो अंडरस्कोर के साथ है, जो अल्फाबेटिक ऑर्डर में विस्तारित है।

[!_]*किसी भी फ़ाइल नाम से मेल नहीं खाता है जो अंडरस्कोर से शुरू नहीं होता है , जो अल्फाबेटिक ऑर्डर में विस्तारित होता है।

-fसॉर्ट नहींls करने के लिए कहता है , क्योंकि शेल पहले से ही किया था।

अधिक जानकारी: बैश फाइलन विस्तार

यदि वर्तमान निर्देशिका में निर्देशिकाएं हैं, तो आप इस तरह से कमांड चलाना चाहेंगे जैसे कि निर्देशिका में फ़ाइलों की लिस्टिंग से बचने के लिए:

ls -lfd _* [!_]*

7
वैसे, डॉस / विंडोज / ओएसएक्स वास्तव में किसी और चीज से पहले अंडरस्कोर नहीं लगाते हैं: वे केस-असंवेदनशील रूप से अक्षरों से पहले अंडरस्कोर लगाते हैं, लेकिन कुछ अन्य विराम चिह्न अक्षर से पहले या बाद में जाते हैं। _पहली बार दिखाई देने वाली फ़ाइलों को बनाने के लिए उपयोग करना ओएस-विशिष्ट हैक है; और इस हैक का यूनिक्स संस्करण एक बड़े अक्षर के साथ फ़ाइल नाम शुरू करने के लिए है: डिफ़ॉल्ट यूनिक्स सम्मेलन फ़ाइल नामों में केवल निचले अक्षरों का उपयोग करना है।
गिल्स एसओ- बुराई को रोकें '

4
या शून्य; उदा 00README
१४:५४ पर मैट

1
@Gilles +1 ने पहले फाइल बनाने के लिए महत्वपूर्ण फाइलों पर कैप्स का उपयोग करने के यूनिक्स सर्वश्रेष्ठ अभ्यास के लिए। दिन के अंत में, यदि यह सम्मेलन है, तो यह शायद सबसे अच्छा है कि मैं बस इसे अपनाता हूं, बजाय यूनिक्स को बाध्य करने के प्रयास के कि अन्य OSes ऐसा करने के लिए मैं ऐसे सम्मेलनों का उपयोग कर सकता हूं जो मैक या विंडोज के लिए विकसित किए गए थे। उत्कृष्ट टिप के लिए धन्यवाद।
टॉम ऑगर

1
@TomAuger अपनी खुद की छँटाई नहीं करने के लिए -fकहता है ls, इसलिए यह अपने तर्कों को उसी क्रम में प्रदर्शित करता है जिस क्रम में वे पास होते हैं। प्रत्येक शेल वाइल्डकार्ड के विस्तार का परिणाम है _*और [!_]*एक शाब्दिक रूप से क्रमबद्ध सूची है।
गिल्स एसओ- बुराई को रोकें '

1
@TomAuger जब वे शेल द्वारा जनरेट किए जाते हैं, तो तर्क lsदो समूहों में सॉर्ट किए जाते हैं: जो _तब शुरू होते हैं , जबकि अन्य)। भागो echo ls -lf _* [!_]*को देखने के लिए क्या होता है। -fध्वज बताता है lsकिसी भी छंटाई करने के लिए नहीं।
गिल्स एसओ-

16

यदि आप लोअरकेस और अपरकेस को मिक्स करने की परवाह नहीं करते हैं, तो अपना लोकेल सेट करें C, जो उनके संख्यात्मक क्रम में अक्षर लेता है। _अपरकेस और लोअरकेस के बीच पड़ता है।

$ LC_COLLATE=C ls    
BAR  FOO  _score  _under  hello  world
$ LC_COLLATE=en_US ls                    
BAR  FOO  hello  _score  _under  world

स्थानीय सेटिंग्स LC_MESSAGES(त्रुटि संदेशों की भाषा), LC_CTYPE(चरित्र सेट) और LC_TIME(तिथि और समय प्रारूप) उपयोगी हैं। LC_COLLATEऔर LC_NUMERICआमतौर पर वे जितना परेशान होते हैं, उससे अधिक परेशानी होती है, मैं उन्हें स्थापित करने की सलाह नहीं देता। उचित लेक्सोग्राफ़िक सॉर्टिंग LC_COLLATEनिर्दिष्ट करने की तुलना में अधिक जटिल है , और जब आप नियमित अभिव्यक्तियों में वर्ण श्रेणियों का उपयोग करते हैं, तो यह सभी प्रकार के अजीब व्यवहार का कारण बन सकता है। LC_NUMERICज्यादातर कॉस्मेटिक है, सिवाय इसके कि जब कुछ बुरी तरह से गलत हो जाता है क्योंकि कुछ प्रोग्राम ने एक दशमलव विभाजक के अलावा एक नंबर का उत्पादन किया .


+1 बहुत दिलचस्प। इसलिए इस फॉर्म का उपयोग करते हुए, आप अस्थायी रूप से पर्यावरण चर LC_COLLATE को केवल एक उदाहरण ls के लिए सेट कर रहे हैं? क्या वह सही है?
टॉम ऑर्नर

1
अंडरस्कोर बनाने का कोई तरीका ऊपरी मामलों के पत्रों से पहले दिखाई देगा?
टॉम ऑगर

1
@TomAuger हाँ, VAR=value cmdसेट VARकरने के लिए valueकेवल के वातावरण में cmdऔर खोल जहां आप इसे चलाने में मूल्य (या मूल्य का अभाव) स्पर्श नहीं करता है। अपरकेस से पहले अंडरस्कोर दिखाई देने के लिए, आपको अपनी खुद की लोकेल सेटिंग्स को परिभाषित करना होगा। यह उपयोग करना संभव है, लेकिन उपयोग करने के लिए अजीब है, क्योंकि कम से कम लिनक्स के तहत, मानक पुस्तकालय केवल स्थानीय परिभाषाओं के लिए दिखता है /usr/lib/locale- कोई भी ~/.localeया पर्यावरण चर नहीं है जहां आप अपनी en_tomसेटिंग डाल सकते हैं।
गिल्स एसओ- बुराई को रोकना '

@TomAuger यदि यह केवल lsकमांड के बारे में है , तो मिकेल के सुझाव पर जाएं
गिल्स एसओ- बुराई को रोकें '

2

दुर्भाग्य से लिनक्स अपने स्थानीय जानकारी के लिए glibc का उपयोग करता है, ICU का नहीं, इसलिए लिनक्स में सीधे लागू करने का कोई तरीका नहीं है, बिना किसी प्रयास के ICU को glibc में वापस लाना या glibc में स्थानीय जानकारी को पूरक करना।


-4

-fस्विच जोड़ने (कोई छँटाई नहीं) ने इसे मेरे लिए इस तरह दिखाया।

man ls

[root@dusknoir ~/java/test]# ls -fl
total 0
-rw-r--r--  1 root  wheel  0 Jun  1 13:27 _1
-rw-r--r--  1 root  wheel  0 Jun  1 13:27 _2
-rw-r--r--  1 root  wheel  0 Jun  1 13:27 _3
-rw-r--r--  1 root  wheel  0 Jun  1 13:27 1
-rw-r--r--  1 root  wheel  0 Jun  1 13:27 2
-rw-r--r--  1 root  wheel  0 Jun  1 13:27 3

6
केवल इसलिए कि वे फाइलसिस्टम में संग्रहीत हैं।
इग्नासियो वाज़केज़-अब्राम्स

3
क्षमा करें, लेकिन यह उत्तर स्पष्ट नहीं है। टेस्ट: touch 3 1 _1 _3 2 _2 && ls -flआउटपुट2 . 1 3 _2 _3 .. _1
मार्को
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.