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

如何用Awk实现文件名首字母提取、字段调换与数字补零重命名

实现方案

可以结合gawk与mv命令完成批量改名,先预览改名结果确认无误后再执行即可。

第一步:预览改名效果(不会实际修改文件名)

for f in *.txt; do
  echo "$f" | gawk -F' - ' '{
    # 数字补零到2位
    num = sprintf("%02d", $1)
    # 提取第二个字段所有单词首字母
    n1 = ""
    split($2, words, /\s+/)
    for(w=1;w<=length(words);w++){
      n1 = n1 substr(words[w],1,1)
    }
    # 提取第三个字段所有单词首字母
    n2 = ""
    split($3, words, /\s+/)
    for(w=1;w<=length(words);w++){
      n2 = n2 substr(words[w],1,1)
    }
    # 拼接目标文件名
    new_name = n1 "-" n2 " - " num " - " $4
    # 生成mv命令,单引号包裹避免空格报错
    printf "mv '\''%s'\'' '\''%s'\''\n", $0, new_name
  }'
done

执行后会输出所有待执行的改名命令,和你给出的示例匹配结果如下:

  • 原文件名01 - Some - Else - Edu.txt对应命令:mv '01 - Some - Else - Edu.txt' 'S-E - 01 - Edu.txt'
  • 原文件名02 - Some thing - Else where - Edu.txt对应命令:mv '02 - Some thing - Else where - Edu.txt' 'St-Ew - 02 - Edu.txt'
  • 原文件名3 - SOME THING - ELSE WHERE - Edu.txt对应命令:mv '3 - SOME THING - ELSE WHERE - Edu.txt' 'ST-EW - 03 - Edu.txt'

第二步:执行改名

确认预览结果符合预期后,在上述命令末尾加| bash即可实际执行改名:

for f in *.txt; do
  echo "$f" | gawk -F' - ' '{
    num = sprintf("%02d", $1)
    n1 = ""
    split($2, words, /\s+/)
    for(w=1;w<=length(words);w++){
      n1 = n1 substr(words[w],1,1)
    }
    n2 = ""
    split($3, words, /\s+/)
    for(w=1;w<=length(words);w++){
      n2 = n2 substr(words[w],1,1)
    }
    new_name = n1 "-" n2 " - " num " - " $4
    printf "mv '\''%s'\'' '\''%s'\''\n", $0, new_name
  }'
done | bash

核心逻辑说明

  • 字段拆分:直接以原分隔符-作为awk的字段分隔符,自动拆分出数字、两个描述段、后缀四个字段,无需额外处理分隔符格式
  • 数字补零:用sprintf("%02d")自动把1位数字补为2位,原有2位数字保持不变
  • 首字母提取:按空格拆分每个描述段的单词,顺序遍历取每个单词首字母拼接,完全保留原大小写规则
  • 容错处理:用单引号包裹原文件名和目标文件名,避免文件名内的空格导致mv命令执行报错

内容的提问来源于stack exchange,提问作者Renato D.O.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.13 13:21:00