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

