使用find、sed、awk批量处理多目录下的idea.js生成对应idea.csv
批量处理多目录下的idea.js生成对应目录的idea.csv
我来帮你搞定这个批量处理的需求!你已经有了单个文件的处理逻辑,现在只需要结合find工具遍历所有目标文件,并在每个文件所在目录执行处理命令即可。下面提供两种可靠的方案:
方案一:用find -execdir一行命令搞定
find的-execdir参数会自动切换到目标文件所在的目录执行命令,完美匹配你“在对应目录生成idea.csv”的需求。直接执行以下命令:
find . -name "idea.js" -execdir sh -c 'sed -n '\''/^get\.idea/s/^.*(\(.*\)).*/\1/ p'\'' "$0" | awk -F, '\''BEGIN {print "idea, description";OFS=","} (NR % 2 ) == 1 {save=$2} (NR % 2) == 0 {print save, $2}'\'' > idea.csv' {} \;
命令拆解:
find . -name "idea.js":从当前目录开始,递归查找所有名为idea.js的文件-execdir sh -c '...' {} \;:切换到每个idea.js所在的目录,执行后续shell命令,{}代表当前找到的文件- 单引号转义:因为外层用了单引号,内部的单引号需要用
\'转义,避免shell解析错误 - 核心处理逻辑和你原来的命令完全一致,最终输出到当前目录的
idea.csv
方案二:用Bash脚本实现(更易读和调试)
如果觉得一行命令的转义太繁琐,可以写一个简单的Bash脚本,逻辑更清晰:
#!/bin/bash # 递归查找所有idea.js文件 find . -name "idea.js" | while read -r file_path; do # 获取文件所在目录 file_dir=$(dirname "$file_path") # 切换到目标目录,若切换失败则跳过当前文件 cd "$file_dir" || continue # 执行你原来的处理命令 sed -n '/^get\.idea/s/^.*(\(.*\)).*/\1/ p' idea.js | awk -F, 'BEGIN {print "idea, description";OFS=","} (NR % 2 ) == 1 {save=$2} (NR % 2) == 0 {print save, $2}' > idea.csv # 回到之前的工作目录,静默输出避免干扰 cd - > /dev/null done
使用方法:
- 将上述内容保存为
batch_process_idea.sh - 赋予执行权限:
chmod +x batch_process_idea.sh - 在需要处理的根目录执行:
./batch_process_idea.sh
优势:
- 逻辑清晰,后续修改处理规则时更方便
- 加入了错误处理,避免因目录异常中断整个流程
- 兼容带空格的文件名和目录名,不会出现解析错误
内容的提问来源于stack exchange,提问作者Carlos
相关产品推荐
相关产品推荐

