我有一堆类似以下的媒体文件:
tvshow.s01e11]Bloodlines.avi
tvshow.s01e12]suffer.avi
tvshow.s01e13]NotMe.avi
我想将它们重命名为
tvshow.s01e11.avi
tvshow.s01e12.avi
tvshow.s01e13.avi
我尝试使用重命名但显然语法不正确因为它失败了。
答案1
这将重命名文件。您需要 \w* 来表示任意数量的字母数字字符。
rename 's/\]\w*//' *
参考: http://www.troubleshooters.com/codecorn/littperl/perlreg.htm#UsingSimpleWildcards
答案2
在 shell 中,可以简单地执行以下操作:
for x in *]*.avi ; do
mv -i "$x" "${x%]*.avi}.avi"
done
shell 可以仅使用常规 glob 生成文件名列表,并
${var%pattern}
从变量 中的字符串末尾删除(最短的)匹配模式var
。由于最终扩展名始终是.avi
,我只需将其与模式一起删除,然后将其添加回来。使用引号,这也应该适用于包含空格的文件名,例如Fancy Name for a Show.s01e01]Asdf.avi
答案3
这完全不切实际 - 其他答案更快更短 - 但是......
您可以使用 PowerShell!Microsoft开源最近更新并使其跨平台。有关适用于您的操作系统的下载和安装说明,请参阅“获取 PowerShell”部分。
安装完成后,您可以使用这个简短的脚本:
Get-ChildItem -File '*]*.avi' | ForEach-Object {
Rename-Item $_ -NewName (($_.Name -Split ']')[0] + '.avi')
}
基本上,它会遍历当前目录中与匹配的每个文件对象*]*.avi
,获取括号之前的部分,将.avi
其添加回去,然后将其指定为新名称。
要直接从 Bash 运行它,请使用以下半高尔夫单行命令:
powershell -command $'gci -File \'*]*.avi\'|%{rename-item $_ -NewName (($_.Name -Split \']\')[0]+\'.avi\')}'
(在 Windows 上的 Ubuntu 上的 Bash 中测试。使用 PowerShell 可能有更短的方法,但我想展示一些不懂正则表达式的人可以理解的东西。)
答案4
这将搜索模式并使用 sed 替换文本。
$sed 's/\(.*]\)[a-zA-z0-9].*\(.avi\)/\1\2/' filename