सवाल बैश में, वाइल्डकार्ड विस्तार क्रम में होने की गारंटी है?


क्या बैश में वाइल्डकार्ड का विस्तार वर्णमाला क्रम में होने की गारंटी है? मुझे एक बड़ी फाइल को 10 एमबी टुकड़ों में विभाजित करने के लिए मजबूर किया गया है ताकि उन्हें मेरी Mercurial भंडार द्वारा स्वीकार किया जा सके।

तो मैं सोच रहा था कि मैं इसका उपयोग कर सकता हूं:

split -b 10485760 Big.file BigFilePiece.

और फिर के स्थान पर:

cat BigFile | bigFileProcessor

मैं कर सकता था:

cat BigFilePiece.* | bigFileProcessor

इसकी जगह पर।

हालांकि, मुझे कहीं भी नहीं मिला जो गारंटी देता है कि तारांकन का विस्तार (उर्फ वाइल्डकार्ड, उर्फ *) हमेशा वर्णमाला क्रम में होगा ताकि वह .aa पहले आया था .ab (जैसा कि टाइमस्टैम्प ऑर्डरिंग या ऐसा कुछ है) के विपरीत।

इसके अलावा, क्या मेरी योजना में कोई दोष है? प्रदर्शन लागत कितनी महान है catफाइल को एक साथ जोड़ना?


44
2018-03-15 19:47


मूल


निश्चित रूप से आप गलत दृष्टिकोण ले रहे हैं। अगर व्यवस्थापक आपके पास भंडार में मौजूद फाइलों के आकार की सीमा डालता है, तो आपको उससे बात करनी चाहिए। विस्तार के बारे में बात करते हुए - मैंने हमेशा देखा है कि विस्तार अल्फान्यूमेरिकल है। - Mircea Vutcovici
आप हमेशा के माध्यम से पाइप कर सकते हैं sort अगर आपको किसी अतिरिक्त ऑर्डर मैनिपुलेशन की आवश्यकता है। - Warner
कृपया ध्यान दें कि Mercurial आपके पास मौजूद रैम की मात्रा से सीमित किसी भी आकार की फ़ाइलों का प्रबंधन कर सकता है। यदि आप एक बड़ी फ़ाइल जोड़ते हैं, तो आपको चेतावनी मिलती है, क्योंकि Mercurial मानता है कि यह फ़ाइल को स्मृति में रख सकता है। विलय के लिए, Mercurial स्मृति में दो फाइलों को पकड़ने की जरूरत है। इसलिए रैम की थोड़ी मात्रा वाली मशीनें फ़ाइल को जांचने में परेशानी हो सकती हैं। मैंने अभी इसका परीक्षण किया, और hg commitपर N एमबी फ़ाइल के बारे में आवश्यकता है 3 * N राम का एमबी और hg update के बारे में आवश्यकता है 2 * N राम का एमबी यह लिनक्स पर Mercurial 1.5 के साथ है। - Martin Geisler


जवाब:


हां, ग्लोबिंग विस्तार वर्णमाला है।

बैश से man पृष्ठ:

पथनाम विस्तार

शब्द विभाजन के बाद, जब तक कि -f विकल्प सेट किया गया है, स्कैन स्कैन       पात्रों के लिए प्रत्येक शब्द *, ?, तथा [। अगर इन पात्रों में से एक है       प्रकट होता है, तो शब्द को एक पैटर्न के रूप में माना जाता है, और एक के साथ प्रतिस्थापित किया जाता है       पैटर्न से मेल खाने वाले फ़ाइल नामों की वर्णानुसार क्रमबद्ध सूची।


59
2018-03-15 20:07



@ डेनिस विलियमसन, कोई विचार अगर यह अभी भी सच होगा यदि उपयोगकर्ता के पास एक अलग भाषा सेट है? - Zoredache
@Zoredache: यह वास्तव में POSIX द्वारा निर्दिष्ट है: opengroup.org/onlinepubs/007908775/xsh/glob.html "पथनाम क्रमबद्ध क्रम में हैं जैसा कि एलसी_Cओएलएलएटी श्रेणी की वर्तमान सेटिंग द्वारा परिभाषित किया गया है, एक्सबीडी विनिर्देश देखें, एलसी_Cओएलएलएटी [opengroup.org/onlinepubs/007908775/xbd/..."और यही कारण है कि आपको चीजें करना चाहिए ls -l [[:lower:]] के बजाय ls -l [a-z]। - Dennis Williamson
ध्यान दें कि ऑर्डर वर्णमाला है इसलिए BigFilePiece.10 BigFilePiece.2 से पहले आएगा - Ken
@ डेनिसविल्लियमसन - स्क्वायर ब्रैकेट के दो जोड़े क्यों? ऐसा लगता है कि मेरे लिए बिल्कुल वही काम करता है। - ArtOfWarfare
@ArtOfWarfare: इसे आजमाएं: mkdir lctest; cd lctest; touch w; touch z; ls -l [:lower:]; echo =====; ls -l [[:lower:]]। "Z" फ़ाइल केवल दूसरे द्वारा सूचीबद्ध है ls क्योंकि यह लोअर केस एकल-अक्षर फ़ाइल नामों के लिए पूछ रहा है। सबसे पहला ls - बाहरी वर्ग के ब्रैकेट के बिना - वर्णों की सूची ":", "एल", "ओ", "डब्ल्यू", "ई", और "आर" की सूची से सिंगल-कैरेक्टर फ़ाइल नामों के लिए पूछ रहा है। दोनों मामलों में बाहरीतम वर्ग ब्रैकेट एक ब्रैकेट अभिव्यक्ति को सीमित करते हैं जो वर्णों और वर्गों को सूचीबद्ध करता है। के मामले में [[:lower:]], आंतरिक वर्ग ब्रैकेट, कोलन और शब्द का नाम एक चरित्र वर्ग है। ... - Dennis Williamson


यह दस्तावेज व्यवहार के लिए है bash तो आप अपनी स्क्रिप्ट में इस पर निर्भर कर सकते हैं। यह बहुत लंबे समय तक अन्य बोर्न संगत गोले के बारे में भी सच रहा है ... हालांकि केस फोल्डिंग या गैर-अल्फान्यूमेरिक वर्णों के संबंध में कोने के मामले हो सकते हैं।

(परिणामस्वरूप सूची, में bash लगभग "ASCII-betical" ऑर्डर में होगा --- सिवाय इसके कि निचले और ऊपरी केस अक्षरों को एक साथ जोड़ दिया जाएगा जैसे कि कोई मामला अंतर नहीं था, लेकिन उनके ऊपरी केस समकक्षों से पहले निचले मामले को एकत्रित किया गया था। सभी गैर-वर्णानुक्रमों को उसी क्रम में एकत्र करना चाहिए जैसा कि वे ASCII में दिखाई देते हैं)।

जैसा कि अन्य ने इंगित किया है कि यह आपकी भाषा से संबंधित पर्यावरण सेटिंग्स से परेशान हो सकता है: आमतौर पर LANG आमतौर पर और LC_COLLATE अधिक विशेष रूप से। हो सकता है कि कमांड चलाने के लिए सबसे सुरक्षित हो जो कि ग्लोब विस्तार ऑर्डर पर निर्भर करता है env पर्यावरण को साफ़ करने के लिए आदेश (का उपयोग कर -i या -u उचित के रूप में) या परिणामों के माध्यम से पाइप करने के लिए sort मजबूत अनुक्रम सुनिश्चित करने के लिए।


2
2018-03-16 04:51



ऐसा प्रतीत होता है कि सभी गैर-अल्फान्यूमेरिक्स हैं अवहेलना करना सॉर्टिंग प्रक्रिया में। इसलिए "=", "_", "~" का उपयोग किसी फ़ाइल को सूची को शुरू या समाप्त करने के लिए मजबूर करने के लिए नहीं किया जा सकता है (क्रमशः)। - Otheus


जबकि ग्लोब विस्तार को वर्णानुक्रम में क्रमबद्ध किया जाता है, वे शैल की लंगेज सेटिंग का भी पालन करते हैं।

यदि आप पोर्टेबल होने का इरादा रखते हैं तो इसे अपनी स्क्रिप्ट में "सी" पर सेट करना सुनिश्चित करें।


1
2018-01-20 12:23