如何使用bash脚本跨目录导出指定目录.txt文件信息为JSON文件
Bash脚本实现生成目录A下txt文件信息的JSON
方案1:使用jq生成合规JSON(推荐)
该方案依赖轻量JSON处理工具jq,可自动处理特殊字符,生成的JSON无语法问题,适合生产环境使用。
安装jq参考:
- Debian/Ubuntu 执行:
sudo apt install jq - macOS 执行:
brew install jq
脚本内容
#!/bin/bash # 请修改以下两个路径为你的实际路径 DIR_A="/absolute/path/to/directory/A" OUTPUT_JSON="/absolute/path/to/save/result.json" # 如需固定从目录B执行,取消注释下一行并修改为目录B的路径 # cd /absolute/path/to/directory/B # 查找所有txt文件并生成JSON find "$DIR_A" -type f -name "*.txt" | jq -n ' { "txt_file_list": [ inputs | { "file_name": split("/")[-1], "storage_path": . } ] }' > "$OUTPUT_JSON"
输出JSON示例
{ "txt_file_list": [ { "file_name": "data1.txt", "storage_path": "/data/dirA/data1.txt" }, { "file_name": "data2.txt", "storage_path": "/data/dirA/sub/data2.txt" } ] }
方案2:原生Bash实现(无外部依赖)
如果环境无法安装jq,可以用原生Bash实现,默认已处理文件名带空格、双引号的场景:
#!/bin/bash DIR_A="/absolute/path/to/directory/A" OUTPUT_JSON="/absolute/path/to/save/result.json" # 初始化JSON结构 echo '{"txt_file_list": [' > "$OUTPUT_JSON" first_entry=1 # 遍历所有txt文件 while IFS= read -r -d '' file_path; do if [ $first_entry -ne 1 ]; then echo "," >> "$OUTPUT_JSON" fi first_entry=0 file_name="${file_path##*/}" # 转义特殊字符 esc_path="${file_path//\"/\\\"}" esc_name="${file_name//\"/\\\"}" printf ' {"file_name":"%s","storage_path":"%s"}' "$esc_name" "$esc_path" >> "$OUTPUT_JSON" done < <(find "$DIR_A" -type f -name "*.txt" -print0) # 闭合JSON结构 echo -e "\n]}" >> "$OUTPUT_JSON"
常见调整项
- 不需要递归查找子目录:给
find命令添加-maxdepth 1参数,放在-type f前面即可 - 存储相对目录A的路径:将
storage_path的取值替换为${file_path#$DIR_A/} - 脚本执行前需确认对目录A有读权限,对JSON输出目录有写权限
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

