批量重命名文件:移除短横线分隔的文件名第3段内容
批量移除文件名中指定分段的解决方案
你的原脚本问题在于用固定长度字符截断,无法适配第三段长度变化的情况,以下是两种可靠的解决方法:
方法一:Bash 参数扩展实现
利用 Bash 字符串处理特性,精准提取需要保留的部分:
#!/bin/bash for file in X*-*-*-*.txt; do # 提取前两段 + 最后一段 new_name="${file%-*%-*}-${file##*-}" # -v 参数用于显示重命名过程,可省略 mv -v "$file" "$new_name" done
语法解释:
${file%-*%-*}:先通过%-*移除最后一个-及后续内容得到前三段;再执行一次%-*移除该结果的最后一个-及后续内容,最终保留前两段(如X103032720-20230630)${file##*-}:移除最后一个-之前的所有内容,保留最后一段(如3.txt)- 用
-拼接两部分,得到目标文件名
方法二:Perl 版 rename 命令(推荐)
如果系统装有 Perl 版rename(大部分 Linux 发行版默认自带),可以用正则表达式批量替换:
# 先执行测试模式(-n 参数),确认输出正确后再移除 -n rename -n 's/^([^-]+-[^-]+)-[^-]+-(.*)$/\1-\2/' X*-*-*-*.txt
正则解释:
^([^-]+-[^-]+):匹配文件名开头的前两段(以-分隔),并捕获为分组1-[^-]+-:匹配要删除的第三段(包含前后的-)(.*)$:匹配剩余的最后一段及文件后缀,捕获为分组2\1-\2:替换为分组1 +-+ 分组2,即保留需要的部分
适配 macOS/BSD 系统
如果是 macOS 或 BSD 系统,默认是 BSD 版rename,语法不同,可结合sed实现:
# 先测试输出,确认正确后移除 echo for file in X*-*-*-*.txt; do echo mv "$file" "$(echo "$file" | sed -E 's/^([^-]+-[^-]+)-[^-]+-(.*)$/\1-\2/')" done
内容的提问来源于stack exchange,提问作者Lex Luthor
相关产品推荐
相关产品推荐

