![删除文件扩展名后的所有字符](https://linux22.com/image/191584/%E5%88%A0%E9%99%A4%E6%96%87%E4%BB%B6%E6%89%A9%E5%B1%95%E5%90%8D%E5%90%8E%E7%9A%84%E6%89%80%E6%9C%89%E5%AD%97%E7%AC%A6.png)
我有几十个文件,例如:
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
答案4
在脚本 bash 中
#!/bin/bash
for i in *.mkv*
do
j=$(echo "$i" | sed -e 's/\.mkv.*$/.mkv/')
mv -- "$i" "$j"
done