2012-08-04 49 views
21

使用正则表达式的文件我有一组命名为喜欢的文件:重命名在Linux

Friends - 6x03 - Tow Ross' Denial.srt 
Friends - 6x20 - Tow Mac and C.H.E.E.S.E..srt 
Friends - 6x05 - Tow Joey's Porshe.srt 

,我想他们像下面

S06E03.srt 
S06E20.srt 
S06E05.srt 

我应该怎么做才能使工作重新命名在linux终端完成? 我已经安装了重命名但你用得到错误如下:

rename -n 's/(\w+) - (\d{1})x(\d{2})*$/S0$2E$3\.srt/' *.srt 

回答

35

您在星号的前面忘了点:

rename -n 's/(\w+) - (\d{1})x(\d{2}).*$/S0$2E$3\.srt/' *.srt 

在openSUSE,红帽,Gentoo,你必须使用的Perl版本renameThis answer显示如何获取它。在Arch上,这个软件包被称为perl-rename

+2

OpenSUSE,RedHat,Gentoo不支持regex in'rename' – mmrmartin 2016-12-15 18:32:08

+0

@mmrmartin:这里使用的重命名脚本是Larry Wall编写的。它用在'/ usr/bin/rename'文件中,但可能它已经被重命名了(没有双关语意思)?在Debian上,脚本名称现在是'/ usr/bin/file-rename'。 – Thor 2016-12-15 18:42:21

+1

openSUSE使用'util-linux'软件包重命名,我没有发现任何提供'file-rename','prename'或'perl-rename'的软件包 - 只有工作解决方案是[使用cpan安装](http:// stackoverflow.com/a/32862278/1392034)。 – mmrmartin 2016-12-15 19:26:16

7

并非每个发行版都提供支持上述示例中使用的正则表达式的rename实用程序 - RedHat,Gentoo及其衍生产品等。

尝试使用的替代品是perl-renamemmv

0

可以使用rnm

rnm -rs '/\w+\s*-\s*(\d)x(\d+).*$/S0\1E\2.srt/' *.srt 

说明:

  1. -rs:替换形式的字符串/search_regex/replace_part/modifier
  2. (\d)(\d)x(\d+)(\d+)为(分别\1\2)两个所俘获groupes 。

更多示例here

4

编辑:找到一种更好的方式列出文件,而无需使用IFSls同时仍然sh标准。

我为做一个shell脚本:

#!/bin/sh 
for file in *.srt; do 
    if [ -e "$file" ]; then 
    newname=`echo "$file" | sed 's/^.*\([0-9]\+\)x\([0-9]\+\).*$/S0\1E\2.srt/'` 
    mv "$file" "$newname" 
    fi 
done 

前面的脚本:

#!/bin/sh 
IFS=' 
' 
for file in `ls -1 *.srt`; do 
    newname=`echo "$file" | sed 's/^.*\([0-9]\+\)x\([0-9]\+\).*$/S0\1E\2.srt/'` 
    mv "$file" "$newname" 
done 
+0

在这个例子中,IFS ='\ n''代表什么?我喜欢它,因为它没有使用任何特殊的东西。 – Szobi 2017-06-16 11:25:40

+0

IFS:扩展后用于分词的内部字段分隔符,以及使用读取内置命令将行拆分为单词的内部字段分隔符。默认值是“” - (来自man bash)。 将其更改为'\ n'允许每行获取一个文件。 – Creak 2017-06-17 16:36:47

0

如果你的Linux没有提供重命名,你也可以使用如下:

find . -type f -name "Friends*" -execdir bash -c 'mv "$1" "${1/\w+\s*-\s*(\d)x(\d+).*$/S0\1E\2.srt}"' _ {} \; 

我经常使用这个片段来在我的控制台中用正则表达式替换。

我不是在壳的东西非常好,但据我理解这段代码,它的解释是这样的:的搜索结果中的找到将上一个bash命令(庆典传递 - c)其中您的搜索结果将作为源文件在$ 1之内。接下来的目标是一个子shell内的替换,结果其中$ 1内容(这里只是您的参数substituion内{ //查找/替换})也将是你的搜索结果。在{}其传递给的-execdir

更好的解释内容,将不胜感激了很多:)

请注意:我只是复制粘贴你的正则表达式;请先用示例文件进行测试。根据您的系统,您可能需要将\ d和\ w更改为字符类,如[[:digit:]]或[[:alpha:]]。然而,\ 1应该为这些团体工作。

1

mmv很简单但有用。它对任何字符串使用*,对匹配字符串中的任何字符使用?,对替换字符串使用#X来引用第X次匹配。

在你的情况:

mmv 'Friends - 6x?? - Tow *.srt' 'S06E#1#2.srt' 

这里#1#2表示其通过??(匹配#1和#2)拍摄到的两位数字。

mmv也提供匹配[];,请阅读手册页获取更多信息!

1

真的很酷lil diddy。

xargs -n2可以在每行打印两个参数。当与Perl的print $_(首先打印$ STDIN)结合使用时,它将成为一个强大的重命名工具。 perl -pe 'print $_; s/OldName/NewName/' | xargs -n2最终被的

find . -type f | perl -pe 'print $_; s/DVDCover/DVDCoverLabel/' | xargs -n2 mv 

结果:

OldName.ext NewName.ext 
OldName.ext NewName.ext 
OldName.ext NewName.ext 
OldName.ext NewName.ext 

我没有Perl的rename一应俱全我的系统上。