Parece que jsonlint
não consegue lidar com vários arquivos:
$ jsonlint -h
Usage: jsonlint [file] [options]
file file to parse; otherwise uses stdin
Note que sempre diz arquivo , nunca arquivos . Quando você executar um comando e canalizar sua saída para xargs
como você fez, xargs
irá simplesmente concatenar toda a saída do comando e passá-la como entrada para qualquer coisa que você tenha dito para executar. Por exemplo:
$ printf "foo\nbar\nbaz\n"
foo
bar
baz
$ printf "foo\nbar\nbaz\n" | xargs echo
foo bar baz
Isso mostra que o comando executado por xargs
foi
echo foo bar baz
No caso de jsonlint
, o que você deseja fazer não é jsonlint -q foo bar baz
, mas
$ jsonlint -q foo
$ jsonlint -q bar
$ jsonlint -q baz
A maneira mais fácil de fazer isso é usar find
como sugerido por @ fede.evol:
$ find . -name \*.json -exec xargs jsonlint -q {} \;
Para fazer isso com xargs
, você precisa usar o sinalizador -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.
Por exemplo:
$ find . -name \*.json | xargs -I {} jsonlint -q {}
Ou, para lidar com nomes estranhos (que contêm novas linhas, por exemplo) com segurança:
$ find . -name \*.json -print0 | xargs -0I {} jsonlint -q '{}'