Dizin ağacındaki geçersiz JSON dosyalarını algıla


4

Dizin ağacına göre geçersiz olan bir JSON dosyası içeriyorsa, bir yapı başarısız olmak istiyorum. jsonlint NPM'den paket .

Bunun kaçmak kadar kolay olacağını düşündüm:

find . -name \*.json | xargs jsonlint -q

Disk üzerinde kötü biçimlendirilmiş bir JSON belgesinin bulunduğunu biliyordum ve bu bir sorunu çözmüyordu.

Daha fazla araştırma gösterir ki find komut ancak beklendiği gibi çalışıyor jsonlint çalıştırılabilir dosya yalnızca bir kez çağrılıyor (ve ilk JSON dosyası doğru.)

Bunu yapmanın daha iyi bir yolu var mı ya da öğrenmem gereken bir şey var mı? xargs İşte?

Ubuntu 13.10 Server kullanıyorum ve gerekirse paketleri yükleyebilirim.

Yanıtlar:


5

Benziyor jsonlint birden fazla dosyayla baş edemez:

$ jsonlint -h

Usage: jsonlint [file] [options]

file     file to parse; otherwise uses stdin

Her zaman söylediğini unutmayın dosya , asla Dosyalar . Bir komutu çalıştırdığınızda ve çıktısını, xargs senin yaptığın gibi xargs sadece komutun çıktısını birleştirecek ve yürütmesini söylediğiniz şeye girdi olarak iletecektir. Örneğin:

$ printf "foo\nbar\nbaz\n"
foo
bar
baz
$ printf "foo\nbar\nbaz\n" | xargs echo
foo bar baz

Bu komut tarafından yürütülen komutunu gösterir. xargs oldu

echo foo bar baz

Bu durumuda jsonlint, yapmak istediğin şey değil jsonlint -q foo bar baz fakat

$ jsonlint -q foo
$ jsonlint -q bar
$ jsonlint -q baz

Bunu yapmanın en kolay yolu kullanmaktır. find @ fede.evol tarafından önerilen şekilde:

$ find . -name \*.json -exec xargs jsonlint -q {} \;

İle yapmak xargs kullanman gerek -I bayrak:

   -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.

Örneğin:

$ find . -name \*.json  | xargs -I {} jsonlint -q {}

Veya, garip isimlerle (örneğin yeni satırlar içeren) güvenli bir şekilde başa çıkmak için:

$ find . -name \*.json -print0  | xargs -0I {} jsonlint -q '{}'

Ubuntu’da, sen ne zaman sudo apt-get install jsonlint, komut jsonlint-php ve -q bayrağına ihtiyacınız yok. Kullanabilirsiniz find . -name \*.json | xargs -I {} jsonlint-php {} .
edelans

1

Her bulma yinelemesinde çalıştırmak için "-exec" seçeneğini kullanın. Yineleme dosyası {} olarak iletildi ve \ kullanıldı; Komutu bitirmek için

Yani şöyle bir şey:

find . -name \*.json -exec jsonlint {} \;

Çıktıda ": ok" ifadesinin ters bir izlemesini yapabilirsiniz. gibi bir şey:

find . -name "*.txt" -exec jsonlint -v {} \; 2>&1 | grep -q -v  ": ok"

Biri doğru değilse doğru olursa yanlış dönecektir. 2 & gt; 1 çirkin ancak hatalar en azından benim jsonlint versiyonumda stderr yazıyor


1

Önerilen komutlar geçersiz dosyanın adını basmayacağından bu soruya verilen cevaplar eksik. Ayrıca, jsonlint yavaş bir araç cehennem.

İşte çok çok çoğu sistemde ek kurulum gerektirmemesi gereken daha hızlı alternatif:

find . -name \*.json -exec echo {} \; -exec python -mjson.tool "{}" \; 2>&1 | grep "No JSON" -B 1

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.