如何在多扩展名目录中用Bash脚本批量执行jsonlint检查JSON文件
解决npm脚本中仅处理单个JSON文件的问题
我来帮你搞定这个问题!首先得说,你之前的命令问题出在两个地方:一是路径匹配写错了,二是用ls传给xargs的方式不太靠谱。
先给你几个直接能用的正确写法
方法1:直接用Glob匹配(最简单)
如果你的目标目录里没有嵌套子目录,直接用路径通配符就能搞定所有.json文件:
jsonlint -q folder/subfolder/*.json
把这个写到npm脚本里就行,Bash会自动把所有匹配到的.json文件作为参数传给jsonlint,不需要xargs多此一举。
方法2:用find命令(更健壮,支持嵌套目录)
如果你的folder/subfolder下面还有子目录,或者文件名里有空格、特殊字符,用find更稳妥:
find folder/subfolder -type f -name "*.json" -exec jsonlint -q {} +
解释下参数:
-type f:只找文件(排除目录)-name "*.json":只匹配后缀为.json的文件-exec jsonlint -q {} +:把所有找到的文件一次性传给jsonlint,和xargs效果一样但更安全
方法3:如果一定要用xargs(不推荐,但满足你的需求)
要是你坚持想用xargs,别用ls,改用printf或者find输出文件路径:
# 用printf输出路径 printf "%s\n" folder/subfolder/*.json | xargs jsonlint -q # 或者用find配合xargs find folder/subfolder -type f -name "*.json" | xargs jsonlint -q
为什么你的原命令不行?
你写的ls folder/subfolder/ *.json其实做了两件事:
- 列出
folder/subfolder/目录下的所有内容(包括非.json文件) - 列出当前目录下的所有
.json文件
这就导致输出里混了一堆无关文件,而且ls的输出格式不适合机器处理——如果文件名里有空格,xargs会把它拆成多个参数,直接报错或者只处理一部分。另外,你想匹配的是子目录里的.json,正确的通配符应该是folder/subfolder/*.json,而不是分开写两个路径。
npm脚本示例
最后给你个package.json里的配置参考:
{ "scripts": { "lint:json": "jsonlint -q folder/subfolder/*.json", "lint:json:recursive": "find folder/subfolder -type f -name \"*.json\" -exec jsonlint -q {} +" } }
直接运行npm run lint:json或者npm run lint:json:recursive就行。
内容的提问来源于stack exchange,提问作者Username123
相关产品推荐
相关产品推荐

