XML फ़ाइलों की एक बड़ी संख्या में सुधार


11

मैं एक नेस्टेड डायरेक्टरी स्ट्रक्चर में बिखरी हुई बड़ी संख्या में XML फाइलों में हेरफेर कर रहा हूं।

मैंने निम्नलिखित कोशिश की:

$ find . -name "*.xml" -type f | xargs -- xmllint --format

समस्या यह है कि स्क्रीन पर स्वरूपित XML आउटपुट उत्पन्न करता है, लेकिन फ़ाइल को परिवर्तित नहीं करता है।

मैं इस आदेश को कैसे बदल सकता हूं ताकि वास्तविक फ़ाइल सामग्री बदल जाए?

जवाबों:


23

यह findसीधे उपयोग से किया जा सकता है -exec:

find . -name "*.xml" -type f -exec xmllint --output '{}' --format '{}' \;

क्या पारित कर दिया है करने के लिए -execप्रति टेम्पलेट मानकों के साथ पाया फ़ाइल एक बार सक्रिय किया जाएगा {}वर्तमान फ़ाइल नाम के साथ प्रतिस्थापित किया जा रहा। \;खोजने के आदेश के अंत पर बस लाइन समाप्त हो जाता है।

xargsइस मामले में वास्तव में उपयोग आवश्यक नहीं है क्योंकि हमें xmllintएक बार प्रति फ़ाइल इनवॉइस करने की आवश्यकता है क्योंकि इनपुट और आउटपुट फ़ाइल दोनों नामों को एक ही कॉल के भीतर निर्दिष्ट किया जाना चाहिए।

xargsजरूरत इस बात की होगी कि कमांड को जिस जगह से ढूंढा जा रहा है वह एक समय में कई फाइलों पर काम कर रहा हो और वह सूची लंबी थी। आप इस मामले में ऐसा नहीं कर सकते हैं, क्योंकि आपको --outputविकल्प के लिए एकल फ़ाइलनाम पास करना होगा xmllintxargsयदि आप बहुत सारी फ़ाइलों को संसाधित कर रहे हैं, तो आप बिना "तर्क सूची के बहुत लंबी" त्रुटि के साथ समाप्त हो सकते हैं। विकल्प के xargsसाथ फ़ाइल प्रतिस्थापित स्ट्रिंग का भी समर्थन करता है -I:

find . -name "*.xml" -type f | xargs -I'{}' xmllint --output '{}' --format '{}'

find -execऊपर के आदेश के समान ही करेंगे । यदि आपके किसी भी फ़ोल्डर में रिक्त स्थान हैं, जैसे रिक्त स्थान आपको और के -0विकल्पों का उपयोग करने की आवश्यकता होगी । लेकिन का उपयोग कर के साथ विकल्प का अर्थ है जिसका अर्थ है केवल वैसे भी एक समय में 1 फ़ाइल पर कार्रवाई है, तो आप के रूप में अच्छी सीधे उपयोग कर सकते हैं के साथ ।findxargsxargs-I-L 1find-exec


@manatwork संपादन के लिए धन्यवाद - चिपचिपा उंगलियां; ओ)
डिस्टर

मैं सिर्फ यह भागा और यह एक इलाज का काम करता है! शीघ्र और संक्षिप्त प्रतिक्रिया के लिए बहुत धन्यवाद!
हैरी

2
"यह विफल हो जाएगा यदि फ़ाइल सूची बहुत बड़ी है": नहीं, यह विफल नहीं होगा (यह एक समय में एक ही फ़ाइल को संसाधित कर रहा है), और वास्तव में find … -execऐसा करने का सबसे सीधा तरीका है।
गाइल्स का SO- बुराई पर रोक '23

@ गिल्स गुड पॉइंट! मैंने उसी हिसाब से अपना जवाब अपडेट किया है।
दीस्टर

1
यह इस तथ्य के कारण काम करता है कि xmllintसबसे पहले पूर्ण xml दस्तावेज़ को मेमोरी में लोड करता है और उसके बाद ही पार्स / राइट आउट होता है। यह दस्तावेज़ को इन-प्लेस प्रोसेसिंग की अनुमति देता है।
गवेंको

6

मैं आम तौर पर अप्रत्यक्ष की एक परत के साथ इन समस्याओं पर हमला करता हूं। एक शेल स्क्रिप्ट लिखें जो आप चाहते हैं और उसे कॉल करें। मैं शुरुआत के रूप में सुझाव दूंगा

#! /bin/sh
for file
do
   xmllint --format $file > $file.tmp && mv $file.tmp $file
done

इसे एक फ़ाइल पर या हाथ से दो पर आज़माएँ, फिर आप इसे xargs में बदल सकते हैं

find . -name "*.xml" -type f | xargs -- xmltidy.sh

यह एक अच्छे दृष्टिकोण की तरह लगता है अगर मुझे भविष्य में और अधिक जटिल हेरफेर करने की आवश्यकता होनी चाहिए। जवाब देने के लिए धन्यवाद।
हैरी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.