脚本Shell用于更改所有文件的名称,但具有特定规则

时间:2014-04-16 18:22:17

标签: shell parsing mv

我有一辆车,我的音频帖子只读特定订单的音乐。

我有一个很大的音乐列表,我想改变001 | justanexemple.mp3上的每一个justanexemple.mp3和“002 | i love stackoverflow”中的下一个“我喜欢stackoverflow.mp3”

另外,我们得到一个限制是当我在009 | music.mp3时,我想要下一个这样的010 | music.mp3

我也遇到问题是我有一些像这样的空间音乐“我喜欢turtles.mp3” 所以命令mv不起作用......

所以我编写了类似这样的内容

    #!/bin/sh                                                                                   

counter=001

for file in `ls -1 *.mp3 | sort -t. -k 2n` 
do   
newname=$counter'|'.$file   
if [ $file != $newname ]
   then mv $file $newname   
fi   
counter=`expr $counter + 1`   
counter="00${counter}" 
echo $counter done

但效果不佳...

我的音乐列表是这样的:

> Kario & Yaret - Somos Lokos (Prod. By Las Ovejas Negras & Gaby.mp3
> Dj_Foxx-T_-_An_Sé_an_Nonm_(feat._Pompis)_-_.mp3
> Harry_Toddler_-_Draw_Mi_Table_wegotitfirst_com.mp3 Kario & Yaret Ft.mp3
> Mc Cassidy Ft. Polakan Y Delirious - Bad Boy.mp3

...

1 个答案:

答案 0 :(得分:2)

  1. Don't parse ls
  2. 不要使用字符串连接格式化数字。使用printf
  3. 引用您的变量
  4. 您的脚本可以写成:

    c=0
    for i in *.mp3; do
      c=$((c+1))
      pref=$(printf "%03d" $c)
      echo "$i" "${pref}|$i"
    done
    

    如果输出似乎正常,请将echo替换为mv以执行实际重命名。