除了RegEx采用的特定部分之外,从文件名中删除所有内容

时间:2015-06-02 07:30:48

标签: regex bash

我有一组文件,它们的名字可能包含字母,数字,空格,圆点,连字符或下划线。

可能性是:

word-123_AnotherWord-asdf1234567.mp4
word-123_AnotherWord-ASDF1234567.mp4
word-123_AnotherWord-1234567asdf.mp4
word-123_AnotherWord-1a2s3d4f5g6.mp4
word-123_AnotherWord-asdf-123456.mp4
word-123_AnotherWord-asdf_123456.mp4
word-123_AnotherWord-123456-asdf.mp4
word-123_AnotherWord-123456_asdf.mp4
word-123_AnotherWord-asdf123456-.mp4
word-123_AnotherWord-asdf123456_.mp4
word-123_AnotherWord--asdf123456.mp4
word-123_AnotherWord-_asdf123456.mp4
word-123_AnotherWord--asdf_12345.mp4
word-123_AnotherWord-_asdf-12345.mp4
word-123_AnotherWord-asdf--12345.mp4
word-123_AnotherWord-asdf_-12345.mp4
... etc

我想:

(1)使用RegEx 获取其姓名的最后11个文本字符串(无论它是什么)。

也许RegEx可以是这样的:

/([a-zA-Z0-9-_]{11})+(?:\.mp4)$/

(2)重命名文件,使用此RegEx部分,为:

outputregex.mp4

这样的事情:

for i in *.mp4;
    do new_name=RegEx from i;
    $i rename to $new_name; 
done

感谢您的合作!

2 个答案:

答案 0 :(得分:2)

从您的示例和评论中,您似乎想要这样:

rename 's/^.*\W(\w{1,11}\.mp4)$/$1/' *.mp4

这个第一个命令仅匹配在该单词之前有非alpha字符。如果不是要求,那么你可以使用这个:

rename 's/.*?(\w{1,11}\.mp4)$/$1/' *.mp4

如果您想要.mp4之前的最后11个字符,无论它们是什么,请使用

rename 's/.*?(.{1,11}\.mp4)$/$1/' *.mp4

没有必要循环,rename为你做。

答案 1 :(得分:1)

您可以使用此rename脚本:

for f in *.mp4; do
    rename 's/^.+?\b(\w+)(?=\.mp4$)/$1/' "$f"
done

你可以使用(感谢@anishsane)单个命令:

rename -n 's/^.+?([\w-]{11})\.mp4$/$1/' *.mp4

PS:-n命令的干运行使用rename选项。