एक्सटेंशन से पहले फ़ाइल नाम में पाठ जोड़ना


25

मैं फ़ाइल नाम के अंत में पाठ जोड़ना चाहूंगा लेकिन विस्तार से पहले। अभी मैं कोशिश कर रहा हूँ,

for f in *.shp; do echo $f_poly; done

आउटपुट है,

Quercus_acutifolia.shp_poly
Quercus_agrifolia.shp_poly
Quercus_corrugata.shp_poly
Quercus_cortesii.shp_poly
Quercus_costaricensis.shp_poly
Quercus_havardii.shp_poly
Quercus_hemisphaerica.shp_poly
Quercus_kelloggii.shp_poly
Quercus_knoblochii.shp_poly
Quercus_laceyi.shp_poly

मैं यह होना चाहता हूँ,

Quercus_acutifolia_poly.shp
Quercus_agrifolia_poly.shp
Quercus_corrugata_poly.shp
Quercus_cortesii_poly.shp
Quercus_costaricensis_poly.shp
Quercus_havardii_poly.shp
Quercus_hemisphaerica_poly.shp
Quercus_kelloggii_poly.shp
Quercus_knoblochii_poly.shp
Quercus_laceyi_poly.shp

जवाबों:


27

मानक POSIX पैरामीटर विस्तार का उपयोग करना :

for f in *.shp; do printf '%s\n' "${f%.shp}_poly.shp"; done

बहुत बढ़िया है कि वास्तव में मैं क्या जरूरत है।
सैम ००

1
एक स्पष्टीकरण के साथ बेहतर हो सकता है कि यह कैसे काम करता है। डग जवाब बहुत आसान है, दूसरी ओर।
सर्ज बोर्स्च

@SargeBorsch आपको क्या समझाया जाना चाहिए? मेरा उत्तर, प्रश्न में स्निपेट, और डौग का उत्तर केवल कुछ वर्णों से भिन्न है, और डौग का उत्तर मेरे से भी कम व्याख्या करता है इसलिए मुझे नहीं पता कि यह आप क्या चाहते हैं। यदि आप प्रश्न में दो आउटपुट में अंतर की तुलना करते हैं तो यह पता लगाना आसान है कि वे क्या करते हैं। मैं समझा सकता हूं कि मेरा जवाब डग के लिए बेहतर क्यों है। 1. मैं printfकम पोर्टेबल के बजाय एक प्रारूप स्ट्रिंग के साथ उपयोग करता हूं echo। 2. मैं पैरामीटर विस्तार का उपयोग करता हूं जो basenameइस तरह के एक सरल कार्य के लिए बाहरी बाइनरी ( ) को कॉल करने की तुलना में अधिक कुशल है ।
jw013

फिर फाइलों का नाम बदलने की कमान यह होगी:for f in *.shp; do mv $f ${f%.shp}_poly.shp; done
पैच92

6

कभी-कभी एक उपकरण होता है जिसे "नाम बदलना" स्थापित किया जाता है।

rename 's/\.shp$/_poly.shp/' *shp

यह पोर्टेबल नहीं हो सकता है लेकिन इसका उपयोग करना आसान है।


1
यह केवल एक है जो मेरे लिए काम करता है, महान जवाब!
wanderer0810

4

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

for file in *.shp; do echo $(basename $file .shp)_poly.shp; done

3
basenameशेल का उपयोग करने की तुलना में धीमी और कम कुशल है जो काम को स्वयं करते हैं। यह बहुत बड़ी संख्या में फाइलों के लिए ध्यान देने योग्य हो सकता है।
jw013

इसके अलावा, लापता उद्धरण और --s हैं और यह उन फ़ाइलनामों के लिए विफल रहता है जिनके पास newline वर्ण हैं .shp
स्टीफन चेजलस 22

जवाब देने के लिए धन्यवाद, मैं वास्तव में अपने उद्देश्य के लिए काम कर सकता हूं। यह बैश मदद है, कोड गोल्फ नहीं। (इस पर पढ़ना .. मुझे एहसास है कि यह लग रहा था जैसे मैं व्यंग्यात्मक हो रहा था। आपके अलावा अन्य उत्तरों के बारे में अधिक मनोरंजक। धन्यवाद फिर से)
टिम

3

इसने मेरे लिए बेहतर काम किया:

for f in *; do NEW=${f%.webm}_2016.webm; mv ${f} "${NEW}"; done


अच्छी तरह से यह स्वीकार किए गए जवाब की तरह दिखता है, सिवाय इसके कि आप शायद चाहते हैं for f in *.webm, आप उद्धृत करना भूल गए ${f}और आप एक को याद कर रहे हैं --
स्टीफन चेजेलस

1
OSX पर स्वीकृत उत्तर काम नहीं करता है, यह केवल नई फ़ाइल नामों को प्रिंट करता है, यह वास्तव में फ़ाइलों का नाम नहीं
विन्नी जेम्स

1
बेशक, यह आपको दिखाता है कि नए फ़ाइल नाम को प्राप्त करने के लिए शेल विस्तार का उपयोग कैसे करें, इस सवाल के जवाब में कि फ़ाइल नाम (साथ echo) का आउटपुट भी है , लेकिन आवश्यक नहीं।
स्टीफन चेज़लस 22

1

यदि वे अलग-अलग स्थानों पर हैं तो चलाएं: -

for i in ` find /root/test/ -name "*.shp" ` ;
do
  mv $i ` echo $i | sed 's/.shp$/_poly.shp/g' ` ;
done

1

के रूप में सवाल यह है bashकि बाहरी उपयोगिताओं की कोई आवश्यकता नहीं है, क्योंकि आप बैश रेग्जाप्स का उपयोग कर सकते हैं :

for i in *.shp
do
    mv -v "${i}" "${i%.*}_MYSUFFIX.${i##*.}"
done
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.