【发布时间】:2016-07-13 11:52:51
【问题描述】:
我正在使用 jsonlint 对目录中的一堆文件进行 lint(递归)。我写了以下命令:
find ./config/pages -name '*.json' -print0 | xargs -0I % sh -c 'echo Linting: %; jsonlint -V ./config/schema.json -q %;'
它适用于大多数文件,但某些文件我收到以下错误:
Linting: ./LONG_FILE_NAME.json
fs.js:500
return binding.open(pathModule._makeLong(path), stringToFlags(flags), mode);
^
Error: ENOENT, no such file or directory '%'
长文件名似乎会失败。有没有办法来解决这个问题?谢谢。
编辑 1: 发现问题了。
-I replstr为每个输入行执行实用程序,替换一个或多个匹配项 replstr 最多替换(如果未指定 -R 标志,则为 5) 具有整行输入的实用程序的参数。所结果的 参数,替换完成后,将不允许增长 超过 255 个字节;这是通过连接尽可能多的 尽可能包含 replstr 的参数,构造参数 到实用程序,最多 255 个字节。 255 字节限制不适用于 实用程序的参数不包含 replstr,此外,没有 替换将在实用程序本身上完成。隐含 -x。
编辑 2: 部分解决。支持比以前更长的文件名,但仍然没有我需要的那么长。
find ./config/pages -name '*.json' -print0 | xargs -0I % sh -c 'file=%; echo Linting: $file; jsonlint -V ./config/schema.json -q $file;'
【问题讨论】:
-
看起来问题出在 jsonlint,而不是 xargs
-
这是 xargs,我发现问题只是不是一个很好的解决方案。查看修改。
-
您可以通过传递
-n 1告诉xargs一次处理一个json 文件。或者,例如通过-n 20一次传递的文件数量可能少于断点。 -
我认为这不会有帮助。将
-I标志与xargs一起使用时,命令的限制为255 个字符。所以如果命令长度为 78 个字符,则文件名只能是 177 个字符。 -
如果你删除了回声,你就可以放弃
-I。find ...|xargs jsonlint -V ./config.schema.json -q另一种选择是在 for 循环中执行此操作。for file in `find ...`; do echo "Linting: $file"; jsonlint -V .... $file; done;