![如何使用 bash shell 参数扩展进行文件名操作](https://linux22.com/image/122982/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%20bash%20shell%20%E5%8F%82%E6%95%B0%E6%89%A9%E5%B1%95%E8%BF%9B%E8%A1%8C%E6%96%87%E4%BB%B6%E5%90%8D%E6%93%8D%E4%BD%9C.png)
我想重命名同一目录中的 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