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
相关产品推荐
相关产品推荐

