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

如何编写Unix脚本从指定目录匹配string-{number}.txt文件生成对应JSON

实现思路

推荐用find+jq的组合方案,既能准确匹配文件,又能自动生成合法JSON,避免手动拼接的格式错误。


完整可运行脚本

#!/bin/bash
# 替换为你要扫描的目标目录
TARGET_DIR="./your_target_dir"

find "$TARGET_DIR" -type f -regextype posix-extended -regex '.*/[^/]+-[0-9]+\.txt$' | \
  # 去除路径前缀,只保留纯文件名
  awk -F '/' '{print $NF}' | \
  # 逐行提取字段生成单条JSON对象
  jq -R '
    match("^.*-(?<num>[0-9]+)\\.txt$") |
    {
      "filenumber": .captures[0].string,
      "name": input_filename
    }' | \
  # 合并所有对象为JSON数组
  jq -s '.'

实现逻辑说明

  • 筛选文件:find命令用正则匹配文件名规则,仅匹配普通文件,自动过滤目录、软链接等非目标对象
  • 提取字段:通过jq的正则捕获组,直接从文件名里提取数字部分作为filenumber的值,不用额外写字符串切割逻辑
  • 生成JSON:jq原生支持JSON序列化,就算文件名里有双引号、空格等特殊字符,也能自动转义,不会出现JSON格式错误

无jq环境的替代方案

如果当前环境没有安装jq,可以用shell循环手动拼接,仅适合文件名无特殊字符的场景:

#!/bin/bash
TARGET_DIR="./your_target_dir"

echo "["
first_item=1
# 遍历所有符合前缀规则的文件
for f in "$TARGET_DIR"/*-[0-9]*.txt; do
  # 跳过不存在的匹配项,排除非文件对象
  [ -f "$f" ] || continue
  filename=$(basename "$f")
  # 提取数字部分
  num=${filename#*-}
  num=${num%.txt}
  # 校验提取的内容是纯数字
  [[ $num =~ ^[0-9]+$ ]] || continue

  # 处理逗号分隔
  [ $first_item -eq 0 ] && echo ","
  first_item=0

  # 输出单条JSON对象
  cat <<EOF
  {
    "filenumber": "$num",
    "name": "$filename"
  }
EOF
done
echo -e "\n]"

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 04:54:03