Ubuntu 22.04终端中批量移除文件名特定格式内容的方法
Ubuntu 22.04终端中批量移除文件名特定格式内容的方法
我来给你几个在Ubuntu 22.04终端里高效解决这个问题的方法,都是实际工作里常用的,你可以按需选择:
方法一:用Perl版rename命令(最简洁)
Ubuntu 22.04默认预装的是Perl版本的rename,这个工具处理批量文件名替换特别顺手。
- 先预览修改效果(强烈推荐先做这一步,避免误操作):
rename -n 's/\.\[\w{8}\]//' *.mp4
这个命令不会实际修改文件名,只会输出如果执行的话会改成什么样子,比如会显示类似rename(160-O.Terror.Está.A.Chegar.[617229A4].mp4, 160-O.Terror.Está.A.Chegar.mp4)的内容,确认没问题再执行实际修改。
- 执行实际改名:
rename 's/\.\[\w{8}\]//' *.mp4
命令拆解:
s/模式/替换内容/:Perl的替换语法,这里是把匹配到的模式替换成空(//就代表空内容)\.\[:因为.和[在正则表达式里是有特殊含义的字符,所以用\转义,用来精准匹配文件名里的. [(注意是连在一起的. [)\w{8}:匹配连续8个字母、数字或下划线,刚好对应你提到的那串8位字符序列*.mp4:限定只对当前目录下所有的mp4文件生效
方法二:用Bash循环+mv命令(兼容性更强)
如果你的系统里碰巧没有Perl版rename(虽然Ubuntu 22.04默认自带,但以防万一),可以用更通用的Bash循环结合mv命令来实现:
同样先做预览(把mv换成echo mv,只输出不会实际改名):
for file in *.mp4; do new_name=$(echo "$file" | sed 's/\.\[[0-9A-Za-z]\{8\}\]//') echo mv -v "$file" "$new_name" done
确认输出的新文件名完全符合你的预期后,去掉echo执行实际改名:
for file in *.mp4; do new_name=$(echo "$file" | sed 's/\.\[[0-9A-Za-z]\{8\}\]//') mv -v "$file" "$new_name" done
命令拆解:
for file in *.mp4:遍历当前目录下所有的mp4文件,把每个文件名赋值给file变量sed 's/\.\[[0-9A-Za-z]\{8\}\]//':用sed工具处理原文件名,[0-9A-Za-z]明确匹配数字和大小写字母,比\w更精准(如果你确定那8位字符只有数字和字母的话)mv -v:-v参数会显示每个文件的改名过程,方便你实时确认操作情况
额外实用提示
- 如果需要处理子目录里的所有mp4文件,可以结合
find命令来实现:
先预览效果:
确认无误后执行实际修改:find . -type f -name "*.mp4" -exec rename -n 's/\.\[\w{8}\]//' {} \;find . -type f -name "*.mp4" -exec rename 's/\.\[\w{8}\]//' {} \; - 操作前最好先复制几个测试文件到空目录里试手,确保命令完全符合预期后,再去处理真实的文件,避免误改重要内容。
备注:内容来源于stack exchange,提问作者Nuno Fonseca
相关产品推荐
相关产品推荐

