使用srt文件的特定方案重命名文件

时间:2016-02-04 07:59:09

标签: regex bash perl rename

我正在尝试重命名一堆媒体文件,但我无法构建正确的正则表达式。我的目的是重命名仅保留扩展名的文件,如果有en.srtfr.srtdu.srtne.srt,则使用后缀。

我尝试了几个命令并且非常接近我的目的但还没有:

rename -n "s/(.*)\/.*\.([[:alnum:]]+|[[:alpha:]]+\.srt)$/\$1\/\$1\.\$2/" */*

$ 2无法捕获.srt扩展名的语言后缀。它只给出了.srt

以下是我构建正则表达式的方法:

dir/file
dir := .*
file :=  filename.ext
filename := .*
ext := .[a-z0-9]+ or [a-z]+.srt <EOL>

似乎问题是.srt匹配普通扩展名,而正则表达式不关心它也匹配第二个或子句。

rename -n "s/(.*)\/.*\.([a-z0-9]{3}|[a-z]{2}\.srt)$/\$1\/\$1\.\$2/" */*

如何正确捕获扩展名以在输出中输入?

pi@raspbian-AH:/media/adrien_EMD/Movies $ rename -n "s/(.*)\/.*\.([a-z]{2}\.srt|[a-z0-9]{3})$/\$1\/\$1\.\$2/" */*
rename(Inside Out (2015)/Inside.Out.2015.720p.BluRay.x264.YIFY.mp4, Inside Out (2015)/Inside Out (2015).mp4)
rename(Seven Samurai (1954)/Seven Samurai (1954).en.srt, Seven Samurai (1954)/Seven Samurai (1954).srt)
rename(Seven Samurai (1954)/Seven Samurai (1954).fr.srt, Seven Samurai (1954)/Seven Samurai (1954).srt)
rename(The Wizard of Oz (1939)/The.Wizard.of.Oz.1939.1080p.BrRip.x264.BOKUTOX.YIFY.mp4, The Wizard of Oz (1939)/The Wizard of Oz (1939).mp4)

七武士不应该出现,因为它已经正确命名。

由于

3 个答案:

答案 0 :(得分:1)

我使用find命令分隔了个案。我现在只需要输入适当的重命名命令。

#!/bin/bash

echo "Media files : "
find . -type f ! -regex ".*\/\..*" ! -regex ".*\.srt$"

echo "Subtitles files : "
find . -type f ! -regex ".*\/\..*" -regex ".*\.srt$"

答案 1 :(得分:0)

raspbian没有grep吗?这应该过滤掉srt文件。

for i in `ls | grep -v '.srt'`;  do echo $i; done

然后您可以添加重命名逻辑,例如:

for i in `ls | grep -v '.srt'`;  do echo $i; rename -n "s/(.*)\/.*\.([a-z0-9]{3}|[a-z]{2}\.srt)$/\$1\/\$1\.\$2/" $i; done

答案 2 :(得分:0)

此问题应标记为&#39; perl&#39;因为&#39;重命名&#39;这里使用的是Perl版本,而不是&#39; util-linux&#39;版本,问题是由于Perl正则表达式的工作方式。更具体地说,这是由于与*的贪婪匹配和回溯之间的相互作用。解决问题的最简单方法是通过附加.*来使第二个?非贪婪:

rename -n "s/(.*)\/.*?\.([a-z]{2}\.srt|[a-z0-9]{3})$/\$1\/\$1\.\$2/" */*

[a-z]替换为[[:alpha:]],将[a-z0-9]替换为[[:alnum:]],就像问题中的第一个示例代码一样,这是一个好主意,但请注意它们也会匹配上层案件信件。