एक विशिष्ट श्रेणी में गिने फ़ाइलों की सूची


16

मेरे पास निर्देशिका में फ़ाइलों का एक सेट है जो निम्नानुसार है:

file1.txt
file2.txt
...
file30.txt
...

अब, मैं फ़ाइलों की एक विशिष्ट श्रेणी पर एक कमांड चलाना चाहता हूं, 18 को 31 के माध्यम से कहने देता हूं।

अब तक मैंने निम्नलिखित तरीकों का उपयोग किया है,

तीन तर्क

command file1[8-9].txt file2[0-9].txt file3[0-1].txt

अब मान लीजिए कि मुझे हर दूसरे नंबर चाहिए,

पाश

for i in `jot - 18 31 2`; do echo file${i}.txt; done | xargs command

ऐसा लगता है कि यह अधिक विश्वसनीय लूप है (रिक्त स्थान का काम)

for i in `jot - 18 31 2`; do echo "\"file${i}.txt\" "; done | xargs command

लेकिन ऐसा लगता है कि ऐसा करने का एक सरल तरीका होना चाहिए। मुझे लगता है कि सबसे अच्छा समाधान एक बैश फ़ंक्शन बनाना है जो फ़ाइलों के सेट को कमांड लाइन पर लौटा देगा। तब मैं कुछ कर सकता था,

command `filerange file 18 31`

क्या इसे कुशलता से करने के बेहतर तरीके या सुझाव हैं?

मैं पहले से माफी मांगता हूं अगर मैंने वही सवाल याद किया जो वेब या कहीं और जवाब दिया गया था superuser


मैंने अपने प्रश्न को अपडेट किया जिसमें forलूप का उपयोग करके समाधान शामिल करना है जो xargs का उपयोग करके फ़ाइल नाम में रिक्त स्थान की अनुमति देता है। यह काम करने लगता है यदि आपके पास 4 बैश नहीं है। यदि आपके पास 4 बैश है, तो निश्चित रूप से ब्रेस विस्तार का उपयोग करें! चयनित उत्तर देखें। स्नो लेपर्ड बैश को अपग्रेड करने के लिए बेशर्म प्लग
मिल्कपोस्टमैन

जवाबों:


25

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

for file in file{18..31}.txt

इसे "अनुक्रम अभिव्यक्ति" के रूप में जाना जाता है और यह बैश के ब्रेस एक्सपेंशन फ़ीचर का हिस्सा है । यह बैश 3 और 4 में काम करता है।

इंक्रीमेंट फीचर बैश 4 के लिए नया है। आपके पास शायद बैश 3.x है।

बैश 4 में, आप कर सकते हैं:

$ for i in {1..6..2}; do echo $i; done
1
3
5

लेकिन बैश 3 में, आपको एक ही परिणाम प्राप्त करने के लिए ऐसा करना होगा:

$ for ((i=1; i<=6; i+=2)); do echo $i; done

एक ही रूप में वृद्धि

$ for ((i=1; i<=6; i++)); do echo $i; done

संख्याओं में से कोई भी चर या भाव हो सकता है। हालाँकि, एक क्रम अभिव्यक्ति में संख्याओं को स्थिर होना पड़ता है

आपकी फ़ाइलों पर उस फ़ॉर्म का उपयोग करने का एक उदाहरण है:

for ((i=18; i<=31; i++))
do
    echo "file${i}.txt"
done

बैश 4 में अनुक्रम अभिव्यक्तियों की एक और नई विशेषता अग्रणी शून्य को शामिल करने की क्षमता है। यह उपयोगी है यदि आप क्रमांकित फ़ाइलों को बनाना (और उपयोग करना) चाहते हैं जो ठीक से सॉर्ट किए जा सकते हैं।

बैश 4 में:

touch file{001..010}.txt

"file010.txt" के माध्यम से "file001.txt" नाम की फाइलें बनाएंगे। उनके नाम अपेक्षित क्रम में क्रमबद्ध होंगे। अग्रणी शून्य के बिना, "file10.txt" "file1.txt" से पहले सॉर्ट करेगा।

फ़ाइलों के साथ काम करने के लिए, आप उसी अग्रणी शून्य सिंटैक्स का उपयोग कर सकते हैं:

for file in file{001..010}.txt; do echo "$file"; done

बैश 3 में, यदि आपको अग्रणी शून्य की आवश्यकता है, तो आपको अपने आप को मान देना होगा:

for i in {1..10}
do
    printf -v i '%03d' $i 
    echo "file${i}.txt"
done

यह printfकथन अग्रणी शून्य के साथ i के मान को बढ़ाएगा, इसलिए चौड़ाई 3 है, उदाहरण के लिए ("4" "004") बन जाता है।

संपादित करें:

फ़ाइल नाम में रिक्त स्थान सीधा है:

$ touch "space name "{008..018..3}" more spaces"
$ ls -l sp*
-rw-r--r-- 1 user group 0 2011-01-22 11:48 space name 000008 more spaces
-rw-r--r-- 1 user group 0 2011-01-22 11:48 space name 000011 more spaces
-rw-r--r-- 1 user group 0 2011-01-22 11:48 space name 000014 more spaces
-rw-r--r-- 1 user group 0 2011-01-22 11:48 space name 000017 more spaces
$ for f in "space name "{008..018..3}" more spaces"; do mv "$f" "${f}.txt"; done
$ ls -l sp*
-rw-r--r-- 1 user group 0 2011-01-22 11:48 space name 000008 more spaces.txt
-rw-r--r-- 1 user group 0 2011-01-22 11:48 space name 000011 more spaces.txt
-rw-r--r-- 1 user group 0 2011-01-22 11:48 space name 000014 more spaces.txt
-rw-r--r-- 1 user group 0 2011-01-22 11:48 space name 000017 more spaces.txt

धन्यवाद! मैं नहीं जानता कि यह मेरा पूरा जीवन कहाँ रहा है। एक बात जो मुझे काम करने के लिए नहीं मिल सकती है, वह यह है कि वेतन वृद्धि OSX संस्करण में काम नहीं करती है। यानी, मैं {1..10..2}अपने OSX बैश में काम नहीं कर सकता ।
मिल्कपोस्टमैन

खैर, यह हिम तेंदुए का कारण है (किसी कारण के लिए) बैश 3.1 का उपयोग कर रहा है। यह एक सॉफ्टवेयर समस्या है।
मिल्कपोस्टमैन

@milkypostman: वेतन वृद्धि की सुविधा और अग्रणी शून्य, {01..10}बाश 4 के लिए नए हैं। आपके पास शायद बैश 3.00 है। यदि आपको वेतन वृद्धि सुविधा की आवश्यकता है या सीमा सीमाओं के लिए चर का उपयोग करने के लिए है, तो इस फॉर्म का उपयोग करें: for ((i=1; i<=10; i+=2}(या i++एक से वृद्धि के लिए)। संख्याओं में से कोई भी चर या भाव हो सकता है। फिर, forलूप के अंदर मूल्य का उपयोग करने के लिए : echo "file${i}.txt". In Bash 3, if you need leading zeros, inside the for loop do: printf -vi '% 03d' $ i` जो iअग्रणी शून्य के साथ मूल्य को छोड़ेगा, इसलिए चौड़ाई 3 है, उदाहरण के लिए ("4" "004")।
अगली सूचना तक रोक दिया गया।

डेनिस, क्या कोई ऐसा तरीका है जिससे आप वैकल्पिक समाधान को शामिल करने के लिए अपने समाधान को अपडेट करेंगे। एक टिप्पणी के रूप में यह थोथा है जिसे मैं शायद प्राप्त करने के लिए प्रेरित करता हूं।
मिल्कपोस्टमैन

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