/ / फाइल के एक्सटेंशन के लिए स्क्रिप्ट - फाइल, बैश

फ़ाइल के एक्सटेंशन प्राप्त करने के लिए स्क्रिप्ट - फ़ाइल, बैश

मुझे एक फ़ोल्डर में सभी फ़ाइल एक्सटेंशन प्रकार प्राप्त करने की आवश्यकता है। उदाहरण के लिए, यदि निर्देशिका का ls निम्नलिखित देता है:

a.t
b.t.pg
c.bin
d.bin
e.old
f.txt
g.txt

मुझे स्क्रिप्ट चलाकर इसे प्राप्त करना चाहिए

.t
.t.pg
.bin
.old
.txt

मेरे पास बैश शेल है।

आपका बहुत बहुत धन्यवाद!

उत्तर:

जवाब के लिए 3 № 1

इसे इस्तेमाल करे:

ls -1 | sed "s/^[^.]*(..*)$/1/" | sort -u
  • ls आपके फ़ोल्डर में फ़ाइलों को सूचीबद्ध करता है, प्रति पंक्ति एक फ़ाइल
  • sed जादू अर्क विस्तार
  • sort -u एक्सटेंशन को सॉर्ट करता है और डुप्लिकेट को निकालता है

sed जादू पढ़ता है:

  • s/ / /: जो कुछ पहले और दूसरे के बीच है / जो दूसरे और तीसरे के बीच है
  • ^: लाइन की शुरुआत मैच
  • [^.]: किसी भी पात्र से मेल खाता है जो कि डॉट नहीं है
  • *: इसे जितनी बार संभव हो मिलाएं
  • ( तथा ): याद रखें कि इन दोनों कोष्ठकों के बीच जो कुछ भी मेल खाता है
  • .: एक बिंदु से मेल खाता है
  • .: किसी भी चरित्र से मेल खाते हैं
  • *: इसे जितनी बार संभव हो मिलाएं
  • $: लाइन का मैच अंत
  • 1: यह वही है जो कोष्ठकों के बीच मेल खाता है

उत्तर के लिए 7 № 2

देख ParsingLS पर BashFAQ प्रविष्टि इनमें से कई उत्तर बुरे क्यों हैं, इसके विवरण के लिए।

निम्नलिखित दृष्टिकोण इस नुकसान से बचा जाता है (और, वैसे, पूरी तरह से बिना किसी विस्तार के फ़ाइलों की उपेक्षा करता है):

shopt -s nullglob
for f in *.*; do
printf "%sn" ".${f#*.}"
done | sort -u

फायदे के बीच:

  • शुद्धता: ls असंगत व्यवहार करता है और अनुचित परिणाम दे सकता है। शीर्ष पर लिंक देखें।
  • दक्षता: उपप्रकारों की संख्या को कम से कम (केवल एक, sort -u, और अगर हम परिणामों को संग्रहीत करने के लिए बैश 4 के साहचर्य सरणियों का उपयोग करना चाहते हैं तो इसे भी हटाया जा सकता है)

चीजें जो अभी भी बेहतर हो सकती हैं:

  • सुधार: यह पहली बार से पहले फ़ाइल नाम में नई कहानियों को सही ढंग से त्याग देगा . (जो कुछ अन्य जवाब "टी" जीता - लेकिन पहले के बाद की नई कहानियों के साथ फिल्माया गया . द्वारा अलग प्रविष्टियों के रूप में माना जाएगा sort। यह सीमांकक के रूप में नल का उपयोग करके, या पूर्वोक्त बाश 4 साहचर्य-सरणी भंडारण दृष्टिकोण द्वारा तय किया जा सकता है।

जवाब के लिए 0 № 3

लोग वास्तव में इसे अधिक जटिल कर रहे हैं - विशेष रूप से रेगेक्स:

ls | grep -o "..*" | uniq

ls - सभी फाइलें प्राप्त करें
grep -o "..*" - -o केवल मैच दिखाओ; "..*" पहले मैच में "।" और इसके बाद सब कुछ
uniq - डॉन "टी प्रिंट डुप्लिकेट लेकिन एक ही क्रम रखें

यदि आप चाहें तो आप इसे सॉर्ट भी कर सकते हैं, लेकिन उदाहरण के लिए मेल नहीं खाता है

यह तब होता है जब आप इसे चलाते हैं:

> ls -1
a.t
a.t.pg
c.bin
d.bin
e.old
f.txt
g.txt

> ls | grep -o "..*" | uniq
.t
.t.pg
.bin
.old
.txt