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

Regex 使用srt文件的特定方案重命名文件,regex,bash,perl,rename,Regex,Bash,Perl,Rename,我试图重命名一堆媒体文件,但无法生成正确的正则表达式。我的目的是重命名仅保留扩展名的文件,如果存在诸如en.srt、fr.srt、du.srt或ne.srt,则使用后缀 我尝试了几个命令,非常接近我的目的,但还没有: rename -n "s/(.*)\/.*\.([[:alnum:]]+|[[:alpha:]]+\.srt)$/\$1\/\$1\.\$2/" */* $2无法捕获.srt扩展名的语言后缀。它只给出了.srt 下面是我如何构建正则表达式的: dir/file dir := .*

我试图重命名一堆媒体文件,但无法生成正确的正则表达式。我的目的是重命名仅保留扩展名的文件,如果存在诸如
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>
如何正确捕获扩展以将其输入到输出中?

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)
七武士不应该出现,因为它已经被正确命名


谢谢

我使用find命令分离了案例。我现在只需要输入相应的重命名命令

#!/bin/bash

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

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

拉斯宾没有格雷普吗?这将过滤掉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

这个问题应该用“perl”标记,因为这里使用的“rename”是perl版本,而不是“util linux”版本,问题是由于perl正则表达式的工作方式。更具体地说,这是由于贪婪匹配与回溯之间的交互作用。修复它的最简单方法是通过附加一个
,使第二个
*
不贪婪:

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

[a-z]
替换为
[:alpha:]
,将
[a-z0-9]
替换为
[:alnum:]
,如问题中的第一个示例代码是个好主意,但请注意,它们也将匹配大写字母。

请显示一些具有代表性的示例名称以及每个名称应映射到的内容。尝试此
/([^\w]+srt)/g
这将以结尾搜索文件。srt@gihan,你能解释一下它是做什么的吗?这只是抓住了单词结尾的
.srt
和其他一些事情,我的意思是重命名它,你必须通过编程来完成。在java中,你可以使用
模式和Matcher
类Advice看起来不错,但我手头没有太多时间,我将尝试理解并在以后使用它。多亏了你的建议,国旗换了
rename -n "s/(.*)\/.*?\.([a-z]{2}\.srt|[a-z0-9]{3})$/\$1\/\$1\.\$2/" */*