正如标题所示,我正在寻找一个bash命令(或者甚至是perl命令),我可以在终端中使用它来帮助我重命名文件夹中的文件。
我是一名DJ,每周通过包含数百首新音乐的zip文件接收音乐,但文件名通常不一致,有时文件在歌曲标题之前有各种字符。我希望在第一个字母之前替换任何字符,并删除字符串末尾的任何多余空格。
Original < 01 - Artist - Song .mp3
New > Arist - Song.mp3
Original < _Artist - Song.mp3
New > Artist - Song.mp3
Original < 04 04 )(*)*+ Artist - Song.wav
New < Artist - Song.wav
几个月后我发现了一个带有正则表达式的bash,它处理字符串前面的[0-9]个字符,我尝试了一些东西,但没有真正有用,所以我发帖在这里看看是否有人可以救命。非常感谢任何帮助,提前谢谢!
我的尝试
for f in [0-9]* ; do
if[[ $f =~ ^[0-9]+[[:blank:]]+(.+) ]] ; then
newname = "${BASH_REMATCH[1]}"
echo "> $newname"
fi
done
答案 0 :(得分:1)
在要重命名的文件所在的目录上尝试以下rename命令。
rename 's/^[^A-Za-z]*([A-Za-z]+) - ([A-Za-z]+)[^.]*/$1 - $2/' *.*
OR
rename 's/^[^A-Za-z]*|\s+(?=\.[^.]*$)//g' *.*
答案 1 :(得分:1)
像
这样的东西sed -r 's/(^[^a-zA-Z]*|\s+)//g'
重命名目录中的每个文件
for file in *;
do
new=`echo $file | sed -r 's/(^[^a-zA-Z]*|\s+)//g'`;
mv "$file" $new;
done
答案 2 :(得分:0)
您可以根据更新的要求轻松调整现有的正则表达式。
if [[ $f =~ ^[^A-Za-z]*(.+[^ ]) *(\....)$ ]] ; then
newname="${BASH_REMATCH[1]}${BASH_REMATCH[2]}"
这假设总是有三个字符的文件扩展名。您可以将第二个带括号的表达式更改为(\.[A-Za-z0-9]{2,5})
,以将其限制为仅包含字母数字,并允许长度介于2到5个字符之间。
您的代码无法按照您编写的方式运行,因为它有一些间距错误。 if
之后的空格很重要,并且在分配中等号的两侧都不能有空格。
答案 3 :(得分:0)
最后一个看起来很奇怪,除非你的意思是:在第一个短划线之前剥离任何东西,或者以数字开头的下划线,可能在括号中有一些文本,破折号下划线,并且在艺术家名称之前带有(或没有)空白的短划线结束。
试试这个:
#!/bin/bash
for f in [0-9]* ; do
echo $f
if [[ $f =~ ^([0-9 ]+|[-_\*]+|\(.+\)|[[:blank:]]*)*(.+) ]]; then
newname="${BASH_REMATCH[2]}"
echo "> ${newname}"
fi
done
我们很清楚,在bash中使用正则表达式可以做些什么。例如,所有比赛都是“贪婪的”。因此推荐的方法是使用sed,awk或perl执行此操作。