You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Linux系统下如何删除文件名中;及后续数字后缀并批量重命名

问题原因

分号;是Shell的特殊命令分隔符,你直接输入mv omer.dat;1 omer.dat时,Shell会把该行拆为两个独立命令执行:mv omer.dat 和 1 omer.dat,自然会提示找不到文件。你之前的参数扩展逻辑${file%;*}本身是正确的,没生效是因为匹配文件时没有正确处理分号的转义,导致没抓到正确的文件名。

解决方法

单个文件重命名

两种方式都可以:

  • 用引号包裹带特殊字符的文件名:
    mv "omer.dat;1" omer.dat
  • 转义分号:
    mv omer.dat\;1 omer.dat

批量重命名

推荐两种常用方案:

方案1:原生Shell循环(不需要额外安装工具,兼容性最好)

先执行预览命令确认修改逻辑正确:

for file in *\;*; do
  echo mv -- "$file" "${file%;*}"
done

确认输出的重命名命令符合预期后,去掉echo执行正式修改:

for file in *\;*; do
  mv -- "$file" "${file%;*}"
done

参数说明:

  • *\;* 匹配所有包含分号的文件名,这里对分号做了转义,避免被Shell识别为命令分隔
  • -- 用于兼容以-开头的文件名,避免mv将文件名识别为命令参数
  • ${file%;*} 是Shell参数扩展,会删除字符串最后一个分号及之后的所有内容

方案2:用rename工具(命令更简洁,适合熟悉正则的场景)

多数Linux发行版默认预装Perl版本的rename,先执行预览:
rename -n 's/;.*$//' *\;*
确认修改列表正确后,去掉-n参数执行:
rename 's/;.*$//' *\;*
正则说明:s/;.*$// 表示匹配第一个分号到行尾的所有内容,替换为空。

内容的提问来源于stack exchange,提问作者Omer Asher

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.13 16:03:02