如何用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.
相关产品推荐
相关产品推荐

