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


13

我有一堆如下的媒体文件:

tvshow.s01e11]Bloodlines.avi
tvshow.s01e12]suffer.avi
tvshow.s01e13]NotMe.avi

我想将它们重命名为

tvshow.s01e11.avi
tvshow.s01e12.avi
tvshow.s01e13.avi

我尝试使用重命名,但是显然语法不正确,因为它失败了。


如果您想在gui中执行此操作,那就太krename可爱了。它具有各种强大的选项,并在实际执行之前向您显示其操作。您甚至可以使用它来测试以后可以在bash中使用的模式。

Answers:



14

在shell中,可以简单地执行以下操作:

for x in *]*.avi ; do 
    mv -i "$x" "${x%]*.avi}.avi"
done

Shell可以仅使用常规glob生成文件名列表,并 ${var%pattern}从variable的字符串末尾删除(最短)匹配模式var。由于最后的扩展名始终是.avi,所以我只用模式将其删除并添加回去。用引号引起来的文件名也应包含空格,例如Fancy Name for a Show.s01e01]Asdf.avi


@NoviceC extglob模式不是一个坏主意。实际上,${x/]*([^.])}应该执行类似的操作,它会删除括号和任意数量的非点。(尽管如果没有其他括号或点,则失败,因为它没有锁定到字符串的末尾)
ilkkachu

那是个很好的观点。但是,当我应该去的时候,我真的只是使问题变得过于复杂${x/]*.avi},只添加了一个.avi像你这样的人。但是我也对名称中的空格如何破译不满意(`find . -name '*]*.avi'`)。我很高兴提供一个有限的标准unix命令方法,因为重命名不是,但是这让我大吃一惊。
新手C

2

这是种不切实际的做法-其他答案则越来越短-但...

您可以使用PowerShell!微软最近开源了它,并使其跨平台。有关您的操作系统的下载和安装说明,请参阅“获取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进行此操作的方法可能要短得多,但是我想展示一些不懂正则表达式的人可以理解的东西。)


Rube Goldberg会感到骄傲!正则表达式是学习的真正PITA,但它们值得多次使用-即使是在我可以使用它们的基本级别上也是如此。

1

Debian有一个名为mmv的软件包,该软件包也可能在其他发行版中提供,并且应该足够容易从源代码进行编译。它允许您编写以下代码:

mmv '*]*.avi' '#1.avi'

您可以阅读Ubuntu手册页以获取更多命令。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.