বিপুল সংখ্যক এক্সএমএল ফাইল পুনরায় ফর্ম্যাট করা হচ্ছে


11

আমি নেস্টেড ডিরেক্টরি কাঠামোয় ছড়িয়ে ছিটিয়ে থাকা বিশাল সংখ্যক এক্সএমএল ফাইলগুলি হেরফের করছি।

আমি নিম্নলিখিত চেষ্টা করেছিলাম:

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

সমস্যাটি হ'ল স্ক্রিনে ফর্ম্যাট করা XML আউটপুট উত্পন্ন করে তবে ফাইলটি পরিবর্তন করে না doesn't

প্রকৃত ফাইলের বিষয়বস্তু পরিবর্তিত হওয়ার জন্য আমি কীভাবে এই আদেশটি পরিবর্তন করতে পারি?

উত্তর:


23

এটি findসরাসরি ব্যবহার থেকে করা যেতে পারে -exec:

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

যা যা পাস হয়েছে -execতা প্রতি ফাইলের জন্য একবার ব্যবহার করা হবে {}যা বর্তমান ফাইলের নামের সাথে টেমপ্লেটের পরামিতিগুলি প্রতিস্থাপন করা হবে। \;Find কমান্ডের প্রান্তে শুধু লাইন বন্ধ।

এই ক্ষেত্রে ব্যবহারটি xargsসত্যই প্রয়োজনীয় নয় কারণ xmllintইনপুট এবং আউটপুট ফাইলের নাম উভয়ই একই কলটির মধ্যে নির্দিষ্ট করতে হবে বলে আমাদের প্রতি ফাইল প্রতি একবার আবেদন করতে হবে।

xargsযদি কমান্ডটি পাইপ করা হয় তখন যদি প্রয়োজন হয় যে একবারে একাধিক ফাইলে কাজ করা ছিল এবং সেই তালিকাটি দীর্ঘ ছিল। আপনি এই ক্ষেত্রে এটি করতে পারবেন না, যেহেতু আপনার একক ফাইলের নামটি --outputঅপশনটিতে পাস করতে হবে xmllintxargsযদি আপনি প্রচুর ফাইল প্রক্রিয়াকরণ করেন তবে আপনি "আর্গুমেন্ট তালিকা খুব দীর্ঘ" ত্রুটিটি শেষ না করেই করতে পারেন। বিকল্পের xargsসাহায্যে ফাইল প্রতিস্থাপনের স্ট্রিংগুলিকে সমর্থন করে -I:

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

find -execউপরের আদেশ হিসাবে একই কাজ করবে । আপনার ফোল্ডার কোনো শূণ্যস্থান মত অদ্ভুত অক্ষর থাকে, তাহলে আপনি ব্যবহার করতে হবে -0এর অপশন findএবং xargs। কিন্তু ব্যবহার xargsসঙ্গে -Iবিকল্প বোঝা -L 1যার অর্থ শুধুমাত্র যাহাই হউক না কেন একটি সময়ে 1 টি ফাইল প্রক্রিয়া করবো, যাতে আপনি সেইসাথে সরাসরি ব্যবহার করতে পারেন findসঙ্গে -exec


@ সম্পাদনা - স্টিকি আঙ্গুলের জন্য মানচিত্রটির ধন্যবাদ; ও)
ডডস্টার

আমি কেবল এটি চালিয়েছি এবং এটি একটি ট্রিট কাজ বলে মনে হচ্ছে! প্রম্পট এবং সংক্ষিপ্ত প্রতিক্রিয়া জন্য অনেক ধন্যবাদ!
হ্যারি

2
"যদি ফাইল তালিকাটি খুব বড় হয় তবে এটি ব্যর্থ হবে": না, এটি ব্যর্থ হবে না (এটি একবারে একটি ফাইলের প্রক্রিয়াজাত করছে), এবং বাস্তবে find … -execএটি করার সবচেয়ে সহজ উপায়।
গিলস 'অসন্তুষ্ট হওয়া বন্ধ করুন'

@ গিলস গুড পয়েন্ট! আমি আমার উত্তর অনুসারে আপডেট করেছি।
ডাস্টস্টার

1
এটি xmllintপ্রথমে সম্পূর্ণ এক্সএমএল ডকুমেন্টকে মেমরিতে লোড করে এবং তারপরে পার্স / লিখুন the এই কারণে এটি কাজ করে। এটি ডকুমেন্টকে ইন-প্লেস প্রসেসিংয়ের অনুমতি দেয়।
gavenkoa

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

এটি ভবিষ্যতে আরও জটিল হেরফের করার প্রয়োজন হলে এটি একটি ভাল পদ্ধতির মতো দেখায়। উত্তরের জন্য ধন্যবাদ.
হ্যারি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.