वहाँ mv की तरह एक linux कमांड है, लेकिन regex के साथ?


41

उदाहरण के लिए मैं चाहता हूँ mv (.*?).sql $1.php,

क्या ऐसा कोई आदेश है जो मुझे नाम बदलने के पैटर्न को निर्दिष्ट करने देता है?

जवाबों:


32

जैसा कि दूसरों ने उल्लेख किया है, renameयह अच्छा है, लेकिन man renameइससे पहले कि आप इसे आज़माएं , मैन पेज ( ) पढ़ें । वहाँ कम से कम दो पूरी तरह से अलग उपकरण कहा जाता है renameऔर जो आपके पास है वह आपके वितरण पर निर्भर करेगा। उन्हें गलत तरीके से बुलाना खतरनाक हो सकता है।

यहाँ लैरी वॉल द्वारा पर्ल-आधारित संस्करण के लिए मैन पेज है जो उबंटू के साथ जहाज करता है। आप इसे एक शानदार अभिव्यक्ति की तरह देते हैंrename 's/\.sql$/.php/' *.sql

यहाँ पुराने पेज को पुराने Red Hat और CentOS डिस्ट्रीब्यूशन वाले जहाजों के नाम के लिए रखा गया है। उपयोग सरल स्ट्रिंग प्रतिस्थापन हैrename .sql .php *.sql

आप एक बार में प्रत्येक फ़ाइल को संसाधित करने के लिए एक बैश वन-लाइनर का उपयोग कर सकते हैं:

$ for f in *.sql; do mv -i "$f" "${f%%.*}.php"; done

क्या कोई पर्ल-आधारित नाम बदलने के लिए विंडोज बाइनरी अपलोड कर सकता है?
mcandre 21

पर्ल संस्करण का नाम फ़ाइलों को एक फ़ाइल सिस्टम से दूसरे में स्थानांतरित नहीं कर सकता है।
lildjwg

बैश वन-लाइनर मददगार है, खासकर जब कोई renameकार्य न हो (यानी बिजीबॉक्स)
आर्टेम

10

वहाँ है rename(1), जो regexes का उपयोग नहीं करता है, लेकिन अपनी समस्या को हल कर सकते हैं:

rename .sql .php *.sql

वहाँ भी है mmv(1), लेकिन मैं अपरिचित हूँ कि यह कैसे काम करता है।


उबंटू और डेबियन में (अन्य वितरणों के बारे में निश्चित नहीं), डिफ़ॉल्ट रूप /usr/bin/renameसे लिंक /usr/bin/prename, जो रेगीक्स लेता है।
07फिंक

5

अच्छा दिन,

आप प्रवेश करने का भी प्रयास कर सकते हैं

for i in $(\ls -d *.sql)
do
mv $i $(echo $i | sed -e 's/\.sql$/\.php/')
done

या इसे बनाने के लिए रेगेक्स के बदलाव को थोड़ा बदलकर इस्तेमाल करें

for i in $(\ls -d | egrep -e '.*\.sql')
do
mv $i $(echo $i | sed -e 's/\.sql$/\.php/')
done

मज़ा कोडिंग खोल के एक बिट के लिए। (-:


2
यह उन फ़ाइलों के साथ विफल हो जाता है जिनमें उनके नाम पर व्हाट्सएप होता है, इसलिए सावधान रहें। कभी भी lsआउटपुट को पार्स नहीं करना चाहिए ।
slhck

sedयद्यपि यह उदाहरण काफी अच्छा है।
उज्ज्वल-स्टार

2

प्लंबर होने के नाते, मुझे पाइप पसंद हैं :)

नोट: यह उत्तर क्रिया है - एक नए व्यक्ति के रूप में मैं इसकी सराहना करता हूं जब कोई व्यक्ति जानता है कि उसे समझाने में समय लगता है, इसलिए मैं 'आगे' का भुगतान कर रहा हूं। यदि आप एक newbee नहीं हैं, तो कृपया लंबाई और वर्बोसिटी का बहाना करें।

ls -1 *_201[67][0-9]* | sed -e 's/\(\(.\+\)[-_]\(201[67][0-9]\{4\}\)\([^.]\+\)\?\.[0-9a-z]\{2,3\}\)/mkdir -p \2\/\3; mv \1 \2\/\3\/\1/' | bash

कहा पे:

ls -1 *_201[67][0-9]*

पैटर्न से मेल खाने वाली सभी फाइलों को सूचीबद्ध करता है, इस मामले में मैं 'YYYYMMDD' के रूप में फ़ाइल नाम में तारीख के साथ फ़ाइलों की तलाश कर रहा हूं

sed -e 's/\(\(.\+\)[-_]\(201[67][0-9]\{4\}\)\([^.]\+\)\?\.[0-9a-z]\{2,3\}\)/mkdir -p \2\/\3; mv \1 \2\/\3\/\1/'
#        : | |    |     |                  | |       |                    |:                                 :
#        : |^2....^    ^3..................^^4.......^                    |:                                 :
#        :^1..............................................................^:                                 :
#        /................filename.................pattern................./...mkdir...and....mv...command.../

^ 1: 1 कब्जा समूह - पूरे फ़ाइलनाम

^ 2: 2 पर कब्जा समूह - फ़ाइल नाम पैटर्न का पहला भाग

^ 3: तीसरा कब्जा समूह - दूसरा फ़ाइल नाम भाग - यहाँ, 'YYYYMMDD' के रूप में दिनांक

^ 4: 4th कैप्चर ग्रुप - डेट और एक्सटेंशन के बीच वैकल्पिक फ़ाइलनाम भाग, और स्वयं एक्सटेंशन

Sooooo .... अगर मेरे पास एक फ़ाइल है जिसका नाम है

CallLog_555123412_20161231-214403.7z

...फिर

mkdir -p \2\/\3; mv \1 \2\/\3\/\1

वास्तव में मतलब है

# make directory and sub-directory
mkdir -p CallLog_555123412/20161231
# move file from current directory to sub-sub-directory just created
mv CallLog_555123412_20161231-214403.7z CallLog_555123412/20161231/CallLog_555123412_20161231-214403.7z

ध्यान दें कि इसे निष्पादित करने के लिए सेड कमांड का आउटपुट 'बैश' के माध्यम से पाइप किया जाता है। वास्तव में उन्हें स्थानांतरित करने के बिना प्रस्तावित फ़ाइल चालों को देखने के लिए, पहले 'हटा दें | अंत में बैश करें, और इसे इस तरह आज़माएं:

ls -1 *_201[67][0-9]* | sed -e 's/\(\(.\+\)[-_]\(201[67][0-9]\{4\}\)\([^.]\+\)\?\.[0-9a-z]\{2,3\}\)/mkdir -p \2\/\3; mv \1 \2\/\3\/\1/'

यह बिल्कुल भी बदलाव नहीं करेगा, लेकिन आपको कमांड दिखाई देगा जिसे निष्पादित किया जाएगा यदि आप इसे चलाते हैं '| bash 'अंत में टैग किया गया।

यह उपयोगी है क्योंकि आप फ़ाइल नाम में भागों से इच्छित किसी भी उप-निर्देशिका को बना सकते हैं, या कुछ और जो आप sed कमांड में 'प्रतिस्थापन' पाठ में जोड़ते हैं। ध्यान दें कि sed को बहुत सारे भागने वाले पात्रों की आवश्यकता होती है, हालाँकि।

SED रेगेक्स कोष्ठक:

(...) कैप्चर ग्रुपिंग के लिए भागने की आवश्यकता है -> \ (... \)

{m, n} को पिछली वस्तु को परिमाणित करने के लिए भागने की आवश्यकता है -> \ {m, n \}

/ प्रतिस्थापन स्ट्रिंग में भागने की आवश्यकता है -> \ /

[...] चरित्र वर्गों के लिए भागने की आवश्यकता नहीं है

प्रतिस्थापन स्ट्रिंग में \ 1 1 कैप्चर किए गए समूह को संदर्भित करता है, और इसी तरह ...

सुरक्षा चेतावनी: कभी भी 'आप' को नष्ट करने के लिए कुछ भी न छोड़ें, लेकिन आप पूरी तरह से बाहर की ओर बढ़ सकते हैं ...

आशा है कि कुछ रुकावटों को साफ करने में मदद करता है :)


1

स्थापित करें mmv, फिर यह करें:

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