删除文件扩展名后的所有字符

删除文件扩展名后的所有字符

我有几十个文件,例如:

title.mkv]-[72+167] - "" yEnc  637005001 (1+889)

我想删除“之后的所有内容”.mkv

我尝试查找一些对我有帮助的正则表达式,但我不明白如何使用它们。

有人可以帮助我吗?

答案1

rename等的注释prename参见:

在这个答案中使用 Perl 变体,而不是 util-linux 的一种形式。正如不:

$ rename --version
rename from util-linux 2.31.1

但:

$ rename --version
/usr/bin/rename using File::Rename version 0.20

或类似的。


使用 Perl 重命名:

rename 's/\.mkv.*/.mkv/s' ./*.mkv*

首先使用该-n选项以确保它符合您的要求。

rename -n 's/\.mkv.*/.mkv/s' ./*.mkv*

简而言之:

s/\.mkv.*/.mkv/s

是:

substitute/<THIS>/<WITH THIS>/s

\.mkv.*匹配文字点,\.然后匹配字符串mkv,最后匹配任何字符(包括\n您需要s标志的字符)零次或多次.*

结果替换.mkv<anything>.mkv.


有一些工具可以帮助阅读和构建表达式,例如https://regex101.com/

答案2

bash

for f in *; do [[ "$f" =~ ^.+\.mkv ]] && mv "$f" "${BASH_REMATCH[0]}"; done

答案3

zshzmv:

autoload zmv
zmv -v '(*.mkv)*' '$1'

删除后的部分最右边的.mkv文件名中出现 的情况(重命名foo.mkv-bar.mkv-whateverfoo.mkv-bar.mkv)。

为了最左边出现(将该文件重命名为foo.mkv),您可以替换*.mkv*.mkv~*.mkv?*匹配以结尾.mkv但也不包含.mkv后跟至少一个字符的字符串,使用~“例外”全局运算符

答案4

在脚本 bash 中

#!/bin/bash
for i in *.mkv*
do
  j=$(echo "$i" | sed -e 's/\.mkv.*$/.mkv/')
  mv -- "$i" "$j"
done

相关内容