我正在尝试重命名一堆媒体文件,但我无法构建正确的正则表达式。我的目的是重命名仅保留扩展名的文件,如果有en.srt
,fr.srt
,du.srt
或ne.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)
七武士不应该出现,因为它已经正确命名。
由于
答案 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:]]
,就像问题中的第一个示例代码一样,这是一个好主意,但请注意它们也会匹配上层案件信件。