我正在使用jsonlint来整理目录中的一堆文件(递归)。我写了以下命令: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:
找到了问题。
编辑2:
部分解决方案。支持的文件名比以前更长,但仍不满足我的需要。
find ./config/pages -name '*.json' -print0 | xargs -0I % sh -c 'file=%; echo Linting: $file; jsonlint -V ./config/schema.json -q $file;'
最佳答案
在类似BSD的系统上(例如Mac OS X)
如果您碰巧是在Mac或freebsd等上,则您的xargs
实现可能支持选项-J
,该选项不受对选项-I
施加的参数大小限制的影响。
Excert from manpage
-J replstr
If this option is specified, xargs will use the data read from standard input to replace the first occurrence of replstr instead of appending that data after all other arguments. This option will not effect how many arguments will be read from input (-n), or the size of the command(s) xargs will generate (-s). The option just moves where those arguments will be placed in the command(s) that are executed. The replstr must show up as a distinct argument to xargs. It will not be recognized if, for instance, it is in the middle of a quoted string. Furthermore, only the first occurrence of the replstr will be replaced. For example, the following command will copy the list of files and directories which start with an uppercase letter in the current directory to destdir:
/bin/ls -1d [A-Z]* | xargs -J % cp -Rp % destdir
如果您需要多次引用repstr
(* points up * TL; DR -J
仅替换首次出现),则可以使用以下模式:echo hi | xargs -J{} sh -c 'arg=$0; echo "$arg $arg"' "{}"
=> hi hi
符合POSIX的方法posix兼容的方法是使用其他工具,例如
sed
构造要执行的代码,然后使用xargs
仅指定实用程序。如果在xargs中未使用repl字符串,则255个字节的限制不适用。 xargs POSIX specfind . -type f -name '*.json' -print |
sed "s_^_-c 'file=\\\"_g;s_\$_\\\"; echo \\\"Definitely over 255 byte script..$(printf "a%.0s" {1..255}): \\\$file\\\"; wc -l \\\"\\\$file\\\"'_g" |
xargs -L1 sh
当然,这在很大程度上违背了xargs
的初衷,但仍然可以用于例如使用xargs -L1 -P10 sh
的并行执行,虽然不是posix,但它得到了广泛的支持。关于bash - xargs命令长度限制,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36224777/