如何在 Bash 中删除文件名中的尾随字符?

如何在 Bash 中删除文件名中的尾随字符?

我有一堆类似以下的媒体文件:

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\')}'

引用转义这个 Stack Overflow 上的答案

(在 Windows 上的 Ubuntu 上的 Bash 中测试。使用 PowerShell 可能有更短的方法,但我想展示一些不懂正则表达式的人可以理解的东西。)

答案4

这将搜索模式并使用 sed 替换文本。

 $sed 's/\(.*]\)[a-zA-z0-9].*\(.avi\)/\1\2/' filename

相关内容