Bash Terminal命令用于重命名多个文件

时间:2014-11-02 06:33:10

标签: regex linux bash perl

正如标题所示,我正在寻找一个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

4 个答案:

答案 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执行此操作。