如何使用 bash shell 参数扩展进行文件名操作

如何使用 bash shell 参数扩展进行文件名操作

我想重命名同一目录中的 MP3 列表,例如:

001 - toto1.mp3
002 - toto3.mp3
003 - toto5.mp3
004 - toto7.mp3
005 - toto9.mp3
toto10.mp3
toto35.mp3
toto59.mp3
toto75.mp3

我尝试了这个命令示例:

for i in *.mp3 ; do echo "${/[0-9]-/i}" ; done 

我有

bash: ${/[0-9]-/i}: bad substitution

我想要这个结果:

toto1.mp3
toto3.mp3
toto5.mp3
toto7.mp3
toto9.mp3
toto10.mp3
toto35.mp3
toto59.mp3
toto75.mp3

谢谢

答案1

您已i为循环中的每个文件名设置了一个变量,但是参数扩展${期望在;之后立即看到变量名称相反,您将它放在最后,就在右花括号之前。

由于您只想删除文件名前面的文本,因此请使用以下语法:

for i in *.mp3 ; do echo "${i#[0-9][0-9][0-9] - }" ; done 

这将删除任何 3领导数字后跟空格短划线空格。

答案2

提及文件 test.txt 中的所有文件名

$ cat test.txt
001 - toto1.mp3
002 - toto3.mp3
003 - toto5.mp3
004 - toto7.mp3
005 - toto9.mp3
toto10.mp3
toto35.mp3
toto59.mp3
toto75.mp3

以下命令将搜索有问题的文件并将其重命名为正确的名称

cat test.txt | sed -n '/^0\{2\}/p' | awk '{print "mv" " " $0 " " $3}' |
sed "s/ /&'/1" | sed "s/.mp3/&'/1" | sh
toto1.mp3
toto3.mp3
toto5.mp3
toto7.mp3
toto9.mp3

相关内容