sorun bir komut satırının uzunluğu sınırlı olması ve *.json
tek bir komut satırı için çok fazla argüman üretir.
for f in *.json; do
cat "$f"
done | jq -s '.' > output.json
: Tek geçici çözüm
bash
sonucun üzerinde yineleme, çünkü bir komut satırı ile aynı sınırları olmayan bir
for
döngü içinde desen genişletmek içten ziyade harici komut için bir argüman listesi oluşturmak zorunda olduğunu
Bu, her dosya için bir kez cat
çalıştırmayı gerektirdiğinden, oldukça verimsizdir. Daha verimli bir çözüm, cat
numaralı telefonu arayarak her seferinde olabildiğince çok dosya ile find
'u kullanmaktır.
find . -name '*.json' -exec cat '{}' + | jq -s '.' > output.json
(Sadece yanı
find . -name '*.json' -exec jq -s '{}' + > output.json
kullanmak mümkün olabilir; tek bir çağrı kıyaslanamaz hangi dosya olduğunu ve nasıl birden çok çağrı jq
için -s
seçeneğini kullanarak bağlı olabilir.
ki afaik çünkü Yaptığım şey, bir grup jöle nesnesini {...} 'çekmek ve onları iyi oluşturulmuş bir dizi nesneye yerleştirmekti. [{...}, {...}, {...}] '. Bu, önerdiğiniz şeyle hala devam ediyor mu? – Kristian
[Bunun gibi ls' kullanmayın] (http://mywiki.wooledge.org/ParsingLs). Bunun yerine 'for' döngüsünü kullanabilirsiniz: * .json'da f için; kedi "$ f" yapmak; tamamlandı | jq -s '.' (Aslında, 'ls * .json 'orijinalinin yaptığı aynı nedenden dolayı başarısız olur: pathname genişlemesinden kaynaklanan çok fazla komut satırı argümanı.) – chepner
Bu türden' find 'özelliğini kullanmamanızı tavsiye ederim. JSON dosyalarından birinin adında yeni bir satır varsa, yalnızca gerçekten sorun oluşturur.Diğer bazı dosya adları sorunlu olabilir, ancak bunun yerine 'IFS = read -r f' kullanılarak ele alınabilir. – chepner