संख्यात्मक रूप से क्रमबद्ध फ़ाइलों की सूची बनाएं


122

मेरे पास फाइलों का एक गुच्छा log1है log164

मैं UNIX टर्मिनल में निर्देशिका (क्रमबद्ध) को सूचीबद्ध करने की कोशिश कर रहा हूं लेकिन इस तरह के कार्य केवल इस तरह प्रारूप प्रदान कर रहे हैं:

home:logs Home$ ls -1 | sort
log1.gz
log10.gz
log100.gz
log101.gz
log102.gz
log103.gz
log104.gz
log105.gz
log106.gz
...etc

मैं जो चाहता हूं

home:logs Home$ ls -1 | sort
log1.gz
log2.gz
log3.gz
log4.gz
log5.gz
log6.gz
log7.gz
...{more here}
log99.gz
log100.gz
log101.gz
log102.gz
...etc

क्या मैं यह करने के लिए उपयोग कर सकता है में कोई सुझाव?


8
यह बिल्कुल एक प्रोग्रामिंग सवाल है, और सिर्फ इसलिए माइग्रेट होने के लायक नहीं है क्योंकि उत्तर में नीच शेल प्रोग्रामिंग भाषा शामिल है !!!
tchrist

यदि आप पहले से जानते हैं कि उनका नामकरण किया log1.gzगया है log164.gz, तो आपको ls -1उनके लिए भी क्या चाहिए ?
बजे

1
@ruakh ls -1 परिणाम को एक कॉलम में प्रदर्शित करता है

3
@ राबियानी: मुझे पता है कि क्या ls -1होता है: यह फाइलनामों को सूचीबद्ध करता है। चूँकि आप पहले से ही फ़ाइलनाम जानते थे, मुझे समझ नहीं आया कि आपको इसके लिए क्या चाहिए। लेकिन जब से आपने केविन के उत्तर को स्वीकार किया है, मुझे अब पता है: आपको इसकी आवश्यकता नहीं थी । जो अधिक समझ में आता है। :-)
रुख

जवाबों:


40

bashके ब्रेसिज़, {}क्रम में उन्हें गणना करेगा:

for file in log{1..164}.gz; do
    process "$file"
done

266

lsइस विशेष मामले के लिए अंतर्निहित सुविधा का उपयोग क्यों नहीं किया जाना चाहिए

-v natural sort of (version) numbers within text

उदाहरण के लिए ls -1v log*


बहुत बढ़िया समाधान, हालांकि मैं चाहता हूं कि एक समान रूप से सरल समाधान का उपयोग किया गया था sort, अगर किसी के पास फ़ाइलों की एक निर्देशिका के बजाय तार की एक सरणी है
हब्रो

23
बीएसडी / ओएसएक्स पर यह विकल्प कुछ और है -v - Force unedited printing of non-graphic characters:।
kenorb

दुर्भाग्य से -v विकल्प AIX (6.1) पर उपलब्ध नहीं है
गुलवीर

6
यह सबसे अच्छा जवाब होना चाहिए।
32r34wgf3e

1
MacOS के लिए यह काम करेगा, उल्लेख के अनुसार एक विकल्प नहीं मिल सकता है, केवलls | sort -n
रिकी लेवी

47

GNU ls के साथ (यानी लिनक्स, Cygwin, या अन्य सिस्टम जिसमें GNU ls विशेष रूप से स्थापित हैं):

ls -v

Zsh में:

echo *(n)

अन्य गोले में:

echo log?.gz log??.gz log???.gz

बदलें echoद्वारा printf '%s\n'यदि आप एक अलग लाइन पर प्रत्येक फ़ाइल नाम चाहते हैं।

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

ls -ld log?.gz; ls -ld log??.gz; ls -ld log???.gz

इन कठिनाइयों से बचने के लिए, अपने फ़ाइल नामों में पर्याप्त अग्रणी शून्य का उपयोग करें ताकि लेक्सिकोग्राफिक प्रकार मानव-अनुकूल ( log001.gz, आदि) हो।


29

जबकि समाधान ls -1vनिश्चित रूप से इस विशेष मामले में सबसे अच्छा है, मुझे लगता है कि यह भी अच्छा है कि sortमूल प्रश्न के साथ काम करता है , क्योंकि यह तब भी काम करता है जब आपका इनपुट नहीं आता है ls। इस मामले में आप उपयोग कर सकते हैं:

ls -1 | sort -n -k1.4

-nविकल्प तरह बताता है संख्यानुसार सॉर्ट करने के लिए, और -k 1.4पहले क्षेत्र के लिए तरह कुंजी (जो इस मामले में पूरी फ़ाइल नाम है) पिछले अप करने के लिए 4 चरित्र से शुरू करता है।


मेरे मामले में, ls -1 | sort -n -k1.4काम नहीं करता है। यह 4 वर्णों के बाद पहले छोड़े गए लोगों को अनारक्षित देता है और 4 वर्ण के बाद छांटा जाता है। मैंने ls -1 |sort | sort -n -k1.4इसके बजाय इस्तेमाल किया और इसने पूरी तरह से काम किया।
प्रभु

3
@ प्रभु, इसके बजाय, आप कर सकते हैं sort -k1.1,1.3 -k1.4nsortकार्यान्वयन के स्थिर होने की आवश्यकता नहीं है, इसलिए आपका दृष्टिकोण सभी कार्यान्वयनों के साथ काम नहीं करेगा। -Vजीएनयू और फ्रीबीएसडी का विकल्प भी देखें sort
स्टीफन चेज़लस

21

GNU sort(लिनक्स पर उपलब्ध के रूप में) में एक "वर्जन सॉर्ट" मोड होता है जो नॉन-नंबर्स के अंदर उन नंबरों की व्याख्या करता है जिस तरह से आप पूछते हैं:

से man 1 sort:

    -V, --version-sort
           natural sort of (version) numbers within text

(खाली परीक्षण फ़ाइलें बनाकर सूची:
touch log1.gz log2.gz log3.gz log99.gz log100.gz log101.gz log102.gz)

आपका उदाहरण मामला, -Vविकल्प जोड़ने (या --version-sort):

ls -1 log*.gz | sort -V
log1.gz
log2.gz
log3.gz
log99.gz
log100.gz
log101.gz
log102.gz


3

Solaris का मेरा संस्करण समर्थन ls -v(grrr) नहीं करता है । और 1 से ऊपर दिए गए सॉर्ट सॉल्यूशन को फाइलनाम में अंकों की स्थिति के ज्ञान की आवश्यकता होती है, और 2) मल्टी-पार्ट वर्जन नंबर जैसी चीजों को संभालती नहीं है।

नीचे दिया गया दृष्टिकोण सोलारिस-संगत है, इसमें अंकों की स्थिति के foreknowledge की आवश्यकता नहीं है, और 2, 3 या 4 घटकों के साथ संस्करण संख्याओं को संभालता है (जैसे: a-1.2, foo-5.6.7, bar_baz_9.10.11.12)। यह sort -fऊपरी-और निचले हिस्से को एक साथ मोड़ने के लिए भी उपयोग करता है, और फाइलों के साथ इंटरमीक्स की गई निर्देशिकाओं को ठीक से हैंडल करता है:

ls -d | sort -f -t . -k 1,1 -k 2,2n -k 3,3n -k 4,4n

ध्यान दें कि यह संस्करण पहले घटक को एक अंक में सीमित करता है।

यदि आपका लक्ष्य ऑपरेटिंग सिस्टम समर्थन करता है ls -v, तो यह स्पष्ट रूप से बेहतर समाधान है।



1
$ ls
log101.gz  log102.gz  log103.gz  log104.gz  log105.gz  log106.gz  log10.gz  log1.gz
$ ls | sort -t . -n -k1.4
log1.gz
log10.gz
log101.gz
log102.gz
log103.gz
log104.gz
log105.gz
log106.gz

1
-t .यहाँ ज़रूरत से ज़्यादा है।
स्टीफन चेज़लस

0

इसने मेरे लिए काम किया।

मेरे पास फाइलें हैं 1.jpg 2.jpg ... 18.jpg

$ echo *.jpg | tr -s ' ' '\n' | sort -n

sortlsunprintable रंग वर्णों के कारण आउटपुट के साथ भ्रमित हो रहा है । यदि आप यह कोशिश करते हैं:

ls -1 --color=none *.jpg | sort -n

यह पूरी तरह से काम करेगा।

sort-iविकल्प के साथ अप्रत्याशित वर्णों को अनदेखा कर सकते हैं, लेकिन यह अभी भी काम नहीं करता है और मुझे नहीं पता कि क्यों।

लेकिन आप हमेशा इस तरह से रंग उतार सकते हैं और sortकाम करेंगे:

ls -1 --color=always *.jpg | sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[mGK]//g" | sort -n

मुझे उम्मीद है कि एक दिन sortइसके लिए एक विकल्प होगा।

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