2014-11-02 154 views
0

正如标题所示,我正在寻找一个bash命令(或者甚至是perl命令),我可以在终端中使用它来帮助我重命名文件夹中的文件。Bash终端命令重命名多个文件

我是一名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 
+2

尝试'rename'命令。 – Barmar 2014-11-02 06:34:11

+0

@Barmar什么是重命名命令? – Chris 2014-11-03 00:56:49

+0

这是一个使用Perl正则表达式重命名文件的脚本。 – Barmar 2014-11-03 01:06:33

回答

1

尝试在要重命名位于文件的目录下面的重命名命令。

rename 's/^[^A-Za-z]*([A-Za-z]+) - ([A-Za-z]+)[^.]*/$1 - $2/' *.* 

OR

rename 's/^[^A-Za-z]*|\s+(?=\.[^.]*$)//g' *.* 
+0

第一个给了我:-bash:在意想不到的标记附近的语法错误'[A-Za-z] +' – Chris 2014-11-03 00:55:59

+0

第二个给了我:-bash:s/^ [^ A-Za-z] * | \ s +(?= \。[^。] * $)// g:没有这样的文件或目录 – Chris 2014-11-03 00:56:20

+1

@Chris听起来好像你没有在第一个参数中加引号。 – Barmar 2014-11-03 01:06:12

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

文件可以是各种类型,即.mp3,.wav,.flac,.m4a,.aac,.aiff等。 – Chris 2014-11-03 00:52:24

+0

另外,得到这个:'sed:illegal选项 - r 用法:sed脚本[-Ealn] [-i扩展名] [文件...] sed [-Ealn] [-i扩展名] [-e脚本] ... [-f script_file] .. 。[file ...]' – Chris 2014-11-03 01:04:36

+0

如果要在目录中重命名整个文件,只需'for file in *'就可以了,这将遍历direcotry中的所有文件。我编辑了包含该答案的答案。 – nu11p01n73R 2014-11-03 03:40:18

0

您可以轻松地调整现有的正则表达式来更新的要求。

if [[ $f =~ ^[^A-Za-z]*(.+[^ ]) *(\....)$ ]] ; then 
    newname="${BASH_REMATCH[1]}${BASH_REMATCH[2]}" 

这假定总是有三个字符的文件扩展名。您可以将第二个加括号的表达式更改为(\.[A-Za-z0-9]{2,5})之类的内容,以将其限制为仅字母数字,并允许长度介于2和5个字符之间。

您的代码无法按照您编写它的方式工作,因为它有一些间距错误。 if之后的空格很重要,您不能在分配中的等号的两侧留出空格。

+0

if语句给我: '-bash:在条件expression'语法错误 '-bash:近'*('' 还要注意,文件名可能多于或少于三成语法错误EX:'.aiff','.flac','.rm','.ra'等 – Chris 2014-11-03 00:57:50

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

+0

最后一个显示的是第一个字符是否是一个字母字符,并删除所有字符有一个字母字符 – Chris 2014-11-04 19:31:06

+0

我从来没有用过sed,awk或perl,你会推荐哪三种,我该怎么做呢? – Chris 2014-11-04 19:31:42