Похоже, jsonlint
не может работать с несколькими файлами:
$ jsonlint -h
Usage: jsonlint [file] [options]
file file to parse; otherwise uses stdin
Обратите внимание, что это всегда говорит файл, а не файлы. Когда вы запустите команду и передадите ее вывод в xargs
как вы это сделали, xargs
просто объединит все выходные данные команды и передаст ее в качестве входных данных тому, что вы сказали ей выполнить. Например:
$ printf "foo\nbar\nbaz\n"
foo
bar
baz
$ printf "foo\nbar\nbaz\n" | xargs echo
foo bar baz
Это показывает, что команда, выполненная xargs
была
echo foo bar baz
В случае с jsonlint
вы должны сделать не jsonlint -q foo bar baz
а
$ jsonlint -q foo
$ jsonlint -q bar
$ jsonlint -q baz
Самый простой способ сделать это - использовать команду find
предложенную @ fede.evol:
$ find . -name \*.json -exec xargs jsonlint -q {} \;
Чтобы сделать это с помощью xargs
вам нужно использовать флаг -I
:
-I replace-str
Replace occurrences of replace-str in the initial-arguments with
names read from standard input. Also, unquoted blanks do not
terminate input items; instead the separator is the newline
character. Implies -x and -L 1.
Например:
$ find . -name \*.json | xargs -I {} jsonlint -q {}
Или для безопасного обращения со странными именами (например, с символами новой строки):
$ find . -name \*.json -print0 | xargs -0I {} jsonlint -q '{}'