2013-10-12 51 views
2

我需要編寫一個shell腳本。改進shell算法

我寫的腳本:

for file in *.gif 
do 
    filename=$(basename "$file") 
    filename=${filename%.*} 
    convert $file $filename.tlf 
done 

這是正確的在您看來?我如何添加名稱更改?

PS:請不要編輯主題,因爲文件名稱是特殊信息。

+1

注:(1)名稱的排列順序與'* .gif'生成的順序不同。這些名字將按字母順序生成。 (2)'basename'操作什麼都不做。你可以寫'filename = $(basename「$ file」.gif)「來刪除後綴,或者你可以在下一行做你的操作。 (3)你需要一個計數器和一個增量操作:循環外的'counter = 1','convert'的第二個參數'$ {counter} _ $ filename.tlf'和'((counter ++))'或者類似於增加計數器。 –

+3

在人們花時間回答問題後,請不要污衊您的問題。這對於試圖回答你的人來說是不公平的。 –

回答

3
nr=0 
for file in *.gif; do 
    nr=$(($nr+1)) 
    filename="$(basename "$file")" 
    filename="${filename%.*}" 
    convert "$file" "${nr}_$filename.tlf" 
done 
+0

不要忘記引號。 – kojiro

1

如果你打算使用basename命令而不是參數擴展的,你應該把它給它的擴展名後綴放棄使用其最大功率。這將一舉兩得。

nr=0 
for file in *.gif; do 
    filename="$((++nr))_$(basename "$file" .gif).tlf" 
    convert "$file" "$filename" 
done 

你也可以做這件事與參數擴展:

nr=0 
for file in *.gif; do 
    filename="$((++nr))_${file##*/}" 
    filename="${filename%.*}" 
    convert "$file" "$filename" 
done 

的參數擴展的好處是,你不調用子shell每次迭代。除非你需要處理大量的文件,否則不會有什麼區別。