कैसे एक विशिष्ट क्रम में फ़ाइलों को सूची के अनुसार बैश में सूचीबद्ध करें?


0

मैं निर्देशिका का एक गुच्छा है जिसमें प्रत्येक फाइलों का एक गुच्छा है। आम तौर पर मैं सभी फाइलों को सूचीबद्ध कर सकता हूं, ls */*.* लेकिन यह हमेशा उन्हें निर्देशिकाओं पर वर्णानुक्रम के अनुसार सूचीबद्ध करता है, फिर प्रत्येक निर्देशिका में वर्णमाला क्रम। इसलिए यह हमेशा आउटपुट देगा

dir1 / file1.foo
dir1 / file2.foo
...
dir2 / file1.foo
dir2 / file2.foo
...
...
दिशानि / file1.foo
दिशानि / file2.foo
...

इसके बजाय मुझे क्या करना पसंद है यह आउटपुट है ताकि निर्देशिका कुछ विशिष्ट क्रम में व्यवस्थित हो (उदाहरण के लिए, रिवर्स में), लेकिन सामान्य रूप से प्रत्येक निर्देशिका के भीतर सभी फाइलें हैं, जैसे:

dirN / file1.foo
dirN / file2.foo
...
... dir1 / file1.foo
dir1
/ file2.foo
...

प्रयोग ls -r */*.*मैं जो चाहता हूं वह नहीं करता क्योंकि यह प्रत्येक निर्देशिका के साथ-साथ स्वयं निर्देशिकाओं के क्रम को भी उलट देता है। मैंने यह प्रयोग करने की कोशिश की ls `ls -r`है कि मैं उन निर्देशिका नामों के लिए क्या चाहता हूं जिनके पास कोई स्थान नहीं है, लेकिन उन लोगों के लिए काम नहीं करेंगे जो करते हैं (जो दुर्भाग्य से उनमें से ज्यादातर हैं)। अगर मैं इसके बजाय कोशिश करता हूं ls "`ls -r`"तो यह उसी चीज को आउटपुट करता है जैसे ls -r- निर्देशिका नामों की एक सूची, लेकिन रिवर्स में। मैं जो चाहता हूं, उसे करने के लिए मैं कैसे बैश हो सकता हूं?

जवाबों:


1

sortकमांड का उपयोग करना :

ls */* | sort -rst '/' -k1,1

साथ में:

  • -t '/' क्षेत्र विभाजक को बदलने के लिए
  • -r एक रिवर्स सॉर्ट करने के लिए
  • -s यह सुनिश्चित करने के लिए कि यह स्थिर है (दूसरे शब्दों में, यह निर्दिष्ट कॉलम से परे ऑर्डर नहीं बदलता है
  • -k1,1 पहले स्तंभ के लिए सॉर्ट को प्रतिबंधित करने के लिए

यह मानता है कि का आउटपुट ls */*पहले से ही सॉर्ट किया गया है (जो इसे होना चाहिए), अन्यथा sortबीच में एक सादे चरण जोड़ें ।


0

zsh स्क्रिप्ट के माध्यम से

लिनक्स / यूनिक्स में अधिकांश चीजों के साथ, चीजों को करने का एक तरीका है। बेहतर या बदतर के लिए, और इसके लायक क्या है, यह एक ही काम करने का एक और तरीका है।

#!/usr/bin/env zsh
Dirs=(*(/D))  # (/D) = /(only directories) D(include hidden or dot)
for D in ${(O)Dirs}  # (O) = reverse sort
do
    L=(${D}/*(ND))  # (ND) = N(in case the glob is empty) D(see above)
    [ ${#L} -eq 0 ] && { print "${D}/" ; continue }  # if empty glob
    print -l ${(o)L}  # (o) = normal sort
done

printzsh बिल्डिन -lप्रत्येक तत्व को अपनी लाइन पर आउटपुट करता है।

Dयदि आप छुपी हुई निर्देशिकाओं और फ़ाइलों को सूचीबद्ध नहीं करना चाहते हैं तो ग्लोब क्वालीफायर को छोड़ दें ।


0

@ Xeniod के उत्तर की अनुपूरक (एक टिप्पणी के रूप में शुरू किया गया था, लेकिन बहुत लंबा है): रिवर्स में छँटाई निर्देशिकाओं की मूल आवश्यकता के अनुसार, और अल्फ़ान्यूमेरिक फ़ाइलों में फ़ाइलें:

$ ls -d */* | sort -s -t '/' -k1,1rn -k2,2

या, यदि फ़ाइलों / निर्देशिकाओं में एक से अधिक अंक हैं, उदाहरण के लिए, बस के बजाय dir1..dir9, आपके पास भी हैं dir10, dir11, dir101,...और फाइलें हैं file1..file10..file101..., तो आप विकल्प का उपयोग करके "संस्करण संख्या" के रूप में सॉर्ट कर सकते हैं -V, केवल अल्फा / न्यूमेरिक सॉर्ट (केवल जीएनयू सॉर्ट पर समर्थित)।

$ ls -d */* | sort -s -t '/' -k1,1rV -k2,2V

आदर्श रूप में, हालांकि, अपने निर्देशिका और फाइल को कुछ विशेष वर्ण लगाकर (या परिसीमन) खेतों आपको डैश ( "की तरह पर क्रमबद्ध करना चाहते हैं होगा -"), उदाहरण के लिए dir-23/file-1.txt, dir-902/file-203.txt, आदि, तो आप कर सकते हैं उस तरह सिर्फ उन क्षेत्रों पर (गैर संख्या की अनदेखी के बाद संख्यात्मक पाठ):

$ ls -d */* | sort -s -t- -k2,2nr  -k3,3n

प्रमुख बिंदु:

  • -k{begin,end}सीमांकक के बीच स्तंभों को /अलग-अलग करने के लिए कई जोड़ें , उदाहरण के लिए, पहले कॉलम को अल्फ़ान्यूमेरिक के रूप में, दूसरे को रिवर्स-न्यूमेरिक के रूप में, तीसरे को "संस्करण संख्या", आदि के रूप में सॉर्ट करें
  • मैंने " -d" को " ls -d */*" जोड़ दिया , ताकि निर्देशिका सामग्री सूचीबद्ध न हो, जो कि मौजूद होने पर छंटनी करेगी। वैकल्पिक रूप से, केवल फ़ाइलों पर विचार करने के लिए, find */ -maxdepth 1 -type fइसके बजाय उपयोग कर सकते हैं ls।)
  • ध्यान दें कि आप वास्तव में अपने प्रकार के "/" के बारे में परवाह नहीं करते हैं, जो आमतौर पर ठीक है। ध्यान दें कि आपके पास -t {delim}एक ही प्रकार में एक से अधिक विकल्प नहीं हो सकते हैं (जैसे -t '-' -k... -t '/'...)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.