2012-10-11 8 views
5

यह शीर्षक थोड़ा उलझन में है, इसलिए मुझे इसे तोड़ने दो। मूल रूप से मैं विभिन्न नामों और एक्सटेंशन के साथ फ़ाइलों की एक पूरी सूची है:विस्तार से पहले अतिरिक्त प्रत्यय वाली फ़ाइल की एक प्रति बनाने के लिए मैं बैश का उपयोग कैसे करूं?

MainDirectory/ 
    image_1.png 
    foobar.jpeg 
    myFile.txt 

एक iPad ऐप्लिकेशन के लिए, मैं प्रत्यय @ 2X इन फ़ाइल नाम के सभी के अंत में जोड़ा के साथ इन की प्रतियां बनाने की जरूरत , एक्सटेंशन से पहले - तो मैं इस के साथ खत्म होगा:

MainDirectory/ 
    image_1.png 
    [email protected] 
    foobar.jpeg 
    [email protected] 
    myFile.txt 
    [email protected] 

इसके बजाय हाथ से एक समय में फ़ाइल नाम एक बदलने की, मैं मेरे लिए यह की देखभाल करने के लिए एक स्क्रिप्ट बनाने के लिए चाहते हैं। मैं वर्तमान में निम्नलिखित है, लेकिन यह अपेक्षा के अनुरूप काम नहीं करता है:

#!/bin/bash 

FILE_DIR=. 

#if there is an argument, use that as the files directory. Otherwise, use . 
if [ $# -eq 1 ] 
then 
    $FILE_DIR=$1 
fi 

for f in $FILE_DIR/* 
do 
    echo "Processing $f" 
    filename=$(basename "$fullfile") 
    extension="${filename##*.}" 
    filename="${filename%.*}" 
    newFileName=$(echo -n $filename; echo -n [email protected]; echo -n $extension) 
    echo Creating $newFileName 
    cp $f newFileName 
done 

exit 0 

मैं भी शुद्ध बैश को यह रखने के लिए, और os-विशिष्ट कॉल पर भरोसा नहीं करना चाहता हूँ। मैं क्या गलत कर रहा हूं? मुझे क्या चाहिए जो करने के लिए मैं क्या बदल सकता हूं या कौन सा कोड काम करेगा?

उत्तर

6
#!/bin/sh -e 
cd "${1-.}" 

for f in *; do 
    cp "$f" "${f%.*}@2x.${f##*.}" 
done 
+0

एक आकर्षण की तरह काम किया! धन्यवाद – Phil

+1

#, ##,%, और %% के बारे में नहीं पता था - बहुत उपयोगी, धन्यवाद! यहां http://tldp.org/LDP/abs/html/string-manipulation.html – ahmedre

1

ऐसा नहीं है कि एक पंक्ति इस तरह में awk से कोई लेना देना बहुत आसान है: (।)

ls -1 | awk -F "." ' { print "cp " $0 " " $1 "@2X." $2 }' | sh 

ls -1 साथ आप फ़ाइलों की सिर्फ नंगे सूची है, तो आप पाइप awk डॉट उपयोग करने के लिए मिलता है विभाजक के रूप में। फिर आप प्रत्येक फ़ाइल की एक प्रति बनाने के लिए एक खोल कमांड बनाते हैं।

cp आदेशों को जांचने के लिए, मैं पहले sh पाइप के बिना कमांड चलाने का सुझाव देता हूं। इस तरह:

ls -1 | awk -F "." ' { print "cp " $0 " " $1 "@2X." $2 }' 
संबंधित मुद्दे

 संबंधित मुद्दे