Linux Bash文件名前缀替换

Linux Bash文件名前缀替换,linux,bash,shell,operators,filenames,Linux,Bash,Shell,Operators,Filenames,我读过很多书,但我似乎无法理解这一点。我正在把我用flac制作的翻录文件转换成mp3播放器的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 "$fil

我读过很多书,但我似乎无法理解这一点。我正在把我用flac制作的翻录文件转换成mp3播放器的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
收件人:富1

但这将是理想的
发信人:25 Foo 1
收件人:1 Foo 1


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

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

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
测试如下:

> 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
> 

那你到底想做什么?从
NN Foo(M)*.flac
更改为
(M)*Foo(M)*.flac
> 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
>