আমার কাছে মনে হয় এই পৃষ্ঠায় বিদ্যমান সমস্ত উত্তর ভুল হিসাবে চিহ্নিত হয়েছে, সঠিক হিসাবে চিহ্নিত হয়েছে including প্রশ্নটি দ্ব্যর্থহীনভাবে কথিত হয়েছে তা থেকে উদ্ভূত হয়।
সংক্ষিপ্তসার: আপনি যদি প্রতিটি ইনপুট প্রদত্ত প্রতিটি লাইনের জন্য "একবারে" কমান্ডটি কার্যকর করতে চান , সম্পূর্ণ লাইনটি (নতুন লাইন ছাড়াই) একক আর্গুমেন্ট হিসাবে কমান্ডটিতে পাস করতে চান , তবে এটি করার জন্য এটি ইউনিক্সের সাথে উপযুক্ত উপায় way
... | tr '\n' '\0' | xargs -0 -n1 ...
জিএনইউতে xargs
কার্যকর এক্সটেনশন থাকতে পারে বা নাও থাকতে পারে যা আপনাকে দূরে সরিয়ে দেয় tr
তবে ওএস এক্স এবং অন্যান্য ইউএনআইএক্স সিস্টেমে এগুলি উপলভ্য নয়।
দীর্ঘ ব্যাখ্যার জন্য এখন ...
Xargs ব্যবহার করার সময় দুটি বিষয় বিবেচনায় নিতে হবে:
- কীভাবে এটি "যুক্তি" তে ইনপুট বিভক্ত হয়; এবং
- একসাথে চাইল্ড কমান্ডটি কতটা তর্ক করতে হবে।
Xargs এর আচরণ পরীক্ষা করতে, আমাদের একটি ইউটিলিটি প্রয়োজন যা এটি দেখায় যে এটি কতবার কার্যকর হয়েছে এবং কত যুক্তিযুক্ত। আমি জানি না যে এটির জন্য কোনও স্ট্যান্ডার্ড ইউটিলিটি আছে কিনা তবে আমরা এটি সহজেই ব্যাশে কোড করতে পারি:
#!/bin/bash
echo -n "-> "; for a in "$@"; do echo -n "\"$a\" "; done; echo
ধরে নিলে আপনি এটি show
আপনার বর্তমান ডিরেক্টরি হিসাবে সংরক্ষণ করেন এবং এটি কার্যকর করে দেন, এটি এখানে কীভাবে কাজ করে তা এখানে:
$ ./show one two 'three and four'
-> "one" "two" "three and four"
এখন, যদি আসল প্রশ্নটি সত্যই উপরের পয়েন্ট ২ সম্পর্কে হয় (যেমনটি আমি মনে করি এটি কয়েকবার পড়ার পরে) এবং এটি এইভাবে পড়তে হবে (সাহসী পরিবর্তনগুলি):
প্রদত্ত ইনপুটটির প্রতিটি যুক্তির জন্য আমি কীভাবে xargs কমান্ডটি কার্যকর করতে পারি ? এর ডিফল্ট আচরণটি হ'ল ইনপুটটিকে আর্গুমেন্টের মধ্যে ফেলে দেওয়া এবং কমান্ডটি যতবার সম্ভব চালানো যায় , প্রতিটি বারে একাধিক যুক্তি দিয়ে যায় ।
তারপরে উত্তরটি হ'ল -n 1
।
আসুন xargs এর ডিফল্ট আচরণের সাথে তুলনা করা যাক যা হোয়াইটস্পেসের চারপাশে ইনপুটকে আলাদা করে দেয় এবং কমান্ডটিকে যতবার সম্ভব কল করে:
$ echo one two 'three and four' | xargs ./show
-> "one" "two" "three" "and" "four"
এবং এর সাথে এর আচরণ -n 1
:
$ echo one two 'three and four' | xargs -n 1 ./show
-> "one"
-> "two"
-> "three"
-> "and"
-> "four"
অন্যদিকে, যদি আসল প্রশ্নটি ছিল পয়েন্ট ১ সম্পর্কিত। ইনপুট বিভক্ত হওয়া এবং এটি এইভাবে পড়তে হবে (এখানে আসা অনেক লোক মনে হয় এটি কেস, বা দুটি বিষয়কে বিভ্রান্ত করছে):
আমি কীভাবে xargs প্রদত্ত প্রতিটি লাইন ইনপুটটির জন্য ঠিক একটি যুক্তি দিয়ে কমান্ডটি কার্যকর করতে পারি ? এর ডিফল্ট আচরণ হ'ল হোয়াইটস্পেসের চারপাশের লাইনগুলি ছিন্ন করা ।
তাহলে উত্তরটি আরও সূক্ষ্ম।
কেউ ভাবেন যে -L 1
এটি সাহায্য করতে পারে তবে এটি প্রমাণিত হয়েছে যে এটি যুক্তির বিশ্লেষণকে পরিবর্তন করে না। এটি প্রতিটি ইনপুট লাইনের জন্য একবারে কমান্ডটি কার্যকর করে that ইনপুট লাইনে যতগুলি যুক্তি রয়েছে:
$ echo $'one\ntwo\nthree and four' | xargs -L 1 ./show
-> "one"
-> "two"
-> "three" "and" "four"
শুধু তা-ই নয়, তবে কোনও লাইন যদি সাদা স্থানের সাথে শেষ হয় তবে এটি পরবর্তীটিতে যুক্ত করা হবে:
$ echo $'one \ntwo\nthree and four' | xargs -L 1 ./show
-> "one" "two"
-> "three" "and" "four"
স্পষ্টতই, -L
xargs আর্গুমেন্টগুলিতে যেভাবে ইনপুট বিভক্ত করে তা পরিবর্তন করার বিষয়ে নয়।
ক্রস-প্ল্যাটফর্ম ফ্যাশনে (জিএনইউ এক্সটেনশনগুলি বাদ দিয়ে) একমাত্র যুক্তিটি হ'ল -0
, যা এনআুল বাইটসের চারপাশে ইনপুটটি বিভক্ত করে।
তারপরে, এটি NU- র সাহায্যে নতুন লাইনগুলি অনুবাদ করার বিষয় মাত্র tr
:
$ echo $'one \ntwo\nthree and four' | tr '\n' '\0' | xargs -0 ./show
-> "one " "two" "three and four"
এখন আর্গুমেন্ট পার্সিং পুরোপুরি শুভ্রক্ষেত্র সহ, ঠিক আছে।
অবশেষে, আপনি যদি এই কৌশলটির সাথে একত্রিত হন তবে আপনি -n 1
প্রতিটি ইনপুট লাইনে ঠিক একটি কমান্ড কার্যকর করতে পারেন, আপনার যা কিছু ইনপুট রয়েছে, এটি মূল প্রশ্নটি দেখার আরও একটি উপায় হতে পারে (সম্ভবত সবচেয়ে স্বজ্ঞাত, শিরোনামটি দেওয়া):
$ echo $'one \ntwo\nthree and four' | tr '\n' '\0' | xargs -0 -n1 ./show
-> "one "
-> "two"
-> "three and four"
find /path -type f -delete
আরও কার্যকর হতে হবে :)