फ़ाइल 'जैसे' rm 'या' mv 'को कैसे फाइल करें। txt, file02.txt ... file85.txt


23

मान लीजिए कि मेरे पास इस तरह नामित फ़ाइलों का एक गुच्छा है:

file01.txt file02.txt file03.txt ... file20.txt

और मैं इन फ़ाइलों की एक सीमा पर एक कमांड निष्पादित करना चाहता हूं।

मुझे पता है कि 'rm' को 'file05.txt' से 'file09.txt' करना चाहते हैं तो मैं कर सकता हूं:

rm file0[5-9].txt

लेकिन मैं file08.txt से file13.txt तक की रेंज को 'rm' कैसे कर सकता हूं? मैंने इस कोड की कोशिश की

rm file[08-13].txt

और यह काम नहीं करता है। मैं यह कमांड चला सकता हूं:

rm file0[89].txt file1[0-3].txt

लेकिन मैं यह जानना चाहूंगा कि क्या यह संभव होने पर मैं केवल एक और परिष्कृत तर्क के साथ 'आरएम' कर सकता हूं।


यहाँ लगभग एक समान प्रश्न का उत्तर दिया गया था: stackoverflow.com/questions/25049411/…
arielf

जवाबों:


38

आपको ब्रेस विस्तार का उपयोग करने की आवश्यकता है bash:

rm file{08..13}.txt

यह फ़ाइलों file08को हटा देगा file13, यदि कोई फ़ाइल गुम है तो त्रुटि संदेश दिखाएगा।

अपनी आवश्यकता को पूरा करने के लिए सीमा निर्धारित करें।


ग्लोबिंग ऑपरेटर के साथ समस्या []यह है कि यह प्रत्येक वर्ण / अंक को एक एकल टोकन के रूप में मानता है और इसलिए केवल एकल अंकों का उपयोग करके श्रेणी की घोषणा का समर्थन करता है।

यदि आप उपयोग करने पर जोर देते हैं [], तो आप इसका मिलान file08करने के लिए इसके बजाय बदसूरत पैटर्न का उपयोग कर सकते हैं file13:

rm file0[8-9].txt file1[0-3].txt

5
ब्रेस विस्तार अल्पविरामों से उपयोगी भी है, के लिए की तरह mv foo.{txt,md}याcp foo.txt{,.bak}
कोस

2

कुछ गोले, जैसे कि उबंटू का डिफ़ॉल्ट /bin/sh(जो है dash) या mkshब्रेस विस्तार नहीं है, या ksh- ब्रेस विस्तार गद्देदार शून्य का उपयोग नहीं कर सकता है:

$ ksh -c 'echo {05..13}'
5 6 7 8 9 10 11 12 13

ऐसे मामलों में, हम printfफ़ाइल नाम के संख्या भाग को प्रारूपित करने के लिए उपयोग कर सकते हैं , और लूप व्यवहार के लिए सी-लाइक को लागू करने के लिए थोड़ी देर के लूप का उपयोग कर सकते हैं ( जो आप चाहते हैं उसके echoसाथ बदलने के लिए नोट करें rm):

$ i=5; while [ "$i" -le 10 ]; do num=$(printf "%.2d" "$i" ); echo "file$num.txt";i=$(($i+1)); done
file05.txt
file06.txt
file07.txt
file08.txt
file09.txt
file10.txt

और यह काफी पोर्टेबल है - साथ काम करता है dash, ksh, mksh, भी bash। के मामले में kshऔर bashहम c-style for loop syntax (but not in case ofmksh ordash` का उपयोग भी कर सकते हैं ):

$ ksh -c 'for((i=5;i<11;i++)); do num=$(printf "%.2d" "$i" ); echo "file$num.txt";done'             
file05.txt
file06.txt
file07.txt
file08.txt
file09.txt
file10.txt

ध्यान दें कि bashमामले में, printfचर का मुद्रण करने का समर्थन करता है, और इस प्रकार हम printf -v num "%.2d" "$i"कमांड प्रतिस्थापन का उपयोग करने के बजाय कर सकते हैं ।

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