निर्देशिका ट्री में अमान्य JSON फ़ाइलों का पता लगाएं


4

यदि निर्देशिका ट्री में JSON फ़ाइल है जो jsonlintNPM के पैकेज के अनुसार अमान्य है, तो मैं एक बिल्ड को विफल करना चाहता हूं ।

मुझे लगा कि यह चलाना जितना आसान होगा:

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

मुझे पता था कि मेरे पास डिस्क पर एक बुरी तरह से JSON दस्तावेज़ है, और यह इसे नहीं उठाता है।

आगे की जांच से पता चलता है कि findकमांड अपेक्षा के अनुसार काम करता है, हालांकि jsonlintनिष्पादन योग्य केवल एक बार बुलाया जा रहा है (और पहली JSON फ़ाइल सही है।)

क्या ऐसा करने का एक बेहतर तरीका है, या कुछ ऐसा है जिसके बारे में मुझे xargsयहाँ जानने की ज़रूरत है?

मैं Ubuntu 13.10 सर्वर चला रहा हूं और जरूरत पड़ने पर पैकेज स्थापित कर सकता हूं।

जवाबों:


5

ऐसा लगता है कि 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 {}

या, अजीब नामों से निपटने के लिए (जिसमें उदाहरण के लिए newlines होते हैं) सुरक्षित रूप से:

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

उबंटु पर, जब आप sudo apt-get install jsonlint, कमांड है jsonlint-phpऔर आपको -q फ्लैग की आवश्यकता नहीं है। आप उपयोग कर सकते हैं find . -name \*.json | xargs -I {} jsonlint-php {}
edelans

1

प्रत्येक खोज पुनरावृत्ति पर निष्पादित करने के लिए "-exec" विकल्प का उपयोग करें। पुनरावृत्ति फ़ाइल को {} और यूज़ \ _ के रूप में पास किया जाता है; आदेश को पूरा करने के लिए।

तो कुछ इस तरह:

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

आउटपुट पर आप ": ok" का उलटा grep कर सकते हैं। कुछ इस तरह:

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

अगर कोई ठीक नहीं है या सही है तो यह गलत होगा। 2> & 1 बदसूरत है, लेकिन त्रुटियों को कम से कम मेरे jsonlint संस्करण पर लिखा जाता है


1

इस प्रश्न के वर्तमान उत्तर अधूरे हैं क्योंकि सुझाए गए आदेश अमान्य फ़ाइल का नाम नहीं छापेंगे। इसके अलावा, jsonlint एक धीमे उपकरण का एक नरक है।

यहां बहुत अधिक तेज़ विकल्प है जिसे अधिकांश सिस्टम पर अतिरिक्त इंस्टॉलेशन की आवश्यकता नहीं है:

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.