【问题标题】:rename files with specific scheme for srt files使用 srt 文件的特定方案重命名文件
【发布时间】:2016-05-13 17:42:41
【问题描述】:

我正在尝试重命名一堆媒体文件,但无法构建正确的正则表达式。我的目的是重命名仅保留扩展名的文件,如果有后缀,则带有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 匹配正常的扩展名,而 regex 不在乎它也匹配第二个 or 子句。

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)

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

谢谢

【问题讨论】:

  • 请展示一些具有代表性的示例名称以及每个名称应映射到的内容。
  • 试试这个/([^\w]+srt)/g这将搜索以.srt结尾的文件
  • @gihan,你能解释一下它是做什么的吗?
  • 这只是捕获了以.srt 结尾的单词以及其他我的意思是重命名这个你必须以编程方式执行的操作。在java 中你可以使用Pattern and Matcher

标签: regex bash perl rename


【解决方案1】:

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

#!/bin/bash

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

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

【讨论】:

    【解决方案2】:

    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
    

    【讨论】:

      【解决方案3】:

      这个问题应该用'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:]],就像问题中的第一个示例代码一样,这是一个好主意,但请注意它们也将匹配大写字母。

      【讨论】:

      • 建议似乎不错,但我手头没有太多时间,我会尝试理解并稍后使用它。多亏您的建议,旗帜已更改
      猜你喜欢
      • 1970-01-01
      • 2017-09-09
      • 2021-10-21
      • 2021-02-05
      • 2015-05-05
      • 2021-06-21
      • 2020-01-27
      • 1970-01-01
      • 2021-07-28
      相关资源
      最近更新 更多