Bash文件名前缀替换

时间:2013-02-05 13:31:42

标签: linux bash shell operators filenames

我已经读完了,但我似乎无法绕过这个。我正在将我在flac中制作的翻录文件转换为mp3播放器。这个集合来自两张CD,所以它们的数字前缀是不可取的。

一些文件名示例:

01 Foo 9.flac
02 Foo 10.flac
03 Foo 11.flac
04 Foo 12.flac
05 Foo 13.flac
25 Foo 1.flac
26 Foo 2.flac
...

这是我到目前为止所拥有的

$for file in *Foo*.flac; do flac -cd "$file" | lame -q 0 -V0 - "/media/mp3player/speech/${file%.flac}.mp3"; done

如何删除数字和空格前缀,最好将其替换为与结束号码对应的内容?

所以迈出正确的方向
来自:25 Foo 1
致:Foo 1

但这是理想的
来自:25 Foo 1
致:1 Foo 1

我已经阅读了Bash参考手册的Shell参数扩展部分,但没有示例,我很难过。我会继续修补,但我想发帖看看是否有人有任何见解。

2 个答案:

答案 0 :(得分:1)

可能有更好的版本,但这应该有效:

for file in *Foo*.flac
do
  n=${file#*Foo} # erase from filename Foo and preceding characters
  n=${n%.flac}   # get file index
  fileout=${n}${file#[0-9]?}.mp3  #this works as long as you have two digits numbers only
  flac -cd "$file" | lame -q 0 -V0 - "/media/mp3player/speech/${fileout}.mp3"
done

答案 1 :(得分:0)

awk '{old=$0;a=$NF;gsub(".flac","",a);$1=a;new=$0;system("mv \""old"\" \""new"\"");}'

测试如下:

> ls -1 01*
01 Foo 25.flac
01 Foo 26.flac
01 Foo 9.flac

> ls -1 01*| awk '{old=$0;a=$NF;gsub(".flac","",a);$1=a;new=$0;system("mv \""old"\" \""new"\"");}'

> ls -1 *.flac
25 Foo 25.flac
26 Foo 26.flac
9 Foo 9.flac
>