xargs -I প্রতিস্থাপন-str বিকল্প পার্থক্য


16

আমার বোধগম্যতা থেকে নীচেরগুলির অর্থ হুবহু একই:

ls -1 | xargs file {}
ls -1 | xargs -I{} file {}

যদি -I বিকল্পটি নির্দিষ্ট না করা থাকে তবে এটি -I {} এ ডিফল্ট হয়}

আমি বর্তমান ডিরেক্টরিতে সমস্ত ফাইল তালিকাভুক্ত করতে চাই এবং সেগুলির fileপ্রতিটিতে কমান্ড চালাতে চাই । কারও নামে ফাঁক রয়েছে। তবে, আমি পার্থক্য লক্ষ্য করেছি। নিচে দেখ:

$ ls -1
Hello World
$ ls -1 | xargs file {}
{}:    ERROR: cannot open `{}' (No such file or directory)
Hello: ERROR: cannot open `Hello' (No such file or directory)
World: ERROR: cannot open `World' (No such file or directory)
$ ls -1 | xargs -I{} file {}
Hello World: directory

-আই {} স্পষ্টভাবে সুনির্দিষ্টভাবে উল্লেখ করা হয়েছে, ফাইলের নাম ফাঁকাগুলি প্রত্যাশিত হিসাবে বিবেচিত হবে।


3
"যদি -I বিকল্পটি নির্দিষ্ট না করা হয় তবে এটি ডিফল্ট -I {}" - এ ভুল, কমপক্ষে GNU xargs সহ।
jjlin

আমি আমার ভুল বুঝতে পারি। আমি xargs fileবা হয় নির্দিষ্ট করা উচিত xargs -I{} file {}। হওয়া উচিত নয় xargs file {}। আমি অনুমান করি যখন আমি স্পষ্টভাবে -I {spec নির্দিষ্ট করে বলছি, বাশ এটি হিসাবে বিবেচনা করবে file "Hello World"। -আর। Without ব্যতীত এটি হিসাবে বিবেচিত হয় file Hello World
s ই

1
(1) এই আলোচনার শেল (বাশ) এর সাথে খুব কমই সম্পর্ক রয়েছে। (২) এটি ভাল যে আপনি -1বিকল্পটি জানেন lsতা কিন্তু ডিফল্টরূপে এটি যখন lsফাইল বা পাইপ হয় তখন আপনার এটির প্রয়োজন হয় না। (3) আপনি -Iঅবমূল্যায়িত -i(লোয়ার কেস I) বিকল্পের সাথে বিভ্রান্ত করছেন । -ifooসমতুল্য -Ifoo, তবে সমতল -iসমান -I{}। তবে ব্যবহার -I{}। (4) আপনি যা করতে চান তা যদি আপনি সত্যিই করতে চান তবে কেন কেবল বলবেন না file *?
স্কট

@ স্কট আমার মূল অভিপ্রায়টি ছিল write সন্ধান করা। -নাম "* .মভ" | xargs -I {} file {} `ফাইলগুলি পুনরাবৃত্তভাবে অনুসন্ধান করতে এবং সেগুলিতে চালিত fileকরতে। তবে আমি ব্যবহার করে একটি সহজ উদাহরণ নিয়ে এসেছি ls। তুমি ঠিক. তার জন্য, file *সেরা।
fores

1
খুঁজে আছে -exec
ক্রিশ্চিয়ান সিপিতু

উত্তর:


20

এর -Iজন্য একটি নির্ধারিত স্থানধারক প্রয়োজন। -iবিকল্প অনুমান করা হবে {}স্থানধারক হয়। এখানেই আমি man xargsকমপক্ষে সাইগউইন এবং সেন্টোস-এ { any এর কোনও অনুমান পেয়েছি ।

কোনও বিকল্প ছাড়াই ডাকা xargs এর স্থানধারকের প্রয়োজন হয় না এবং এটি কেবল যুক্তিগুলির শেষে STDIN সংযুক্ত করে।

echoXargs কী করছে তা দেখতে কেবল আপনার উদাহরণগুলিতে যুক্ত করুন :

$ ls -1
Hello World/

আপনার উদাহরণ ভুলভাবে ব্যবহার করে {}:

$ ls -1 | xargs echo file {}
file {} Hello World/

তাই fileসেন্টিমিডিটি {} Hello Worldত্রুটিগুলি এবং ত্রুটিগুলি দেখে ।

আপনি যদি নিজের এক্সার্গ্স কলটিতে স্পষ্টভাবে ব্যবহার করতে চান {}:

$ ls -1 | xargs -i echo file {}
file Hello World/

বা কোনও স্থানধারক সহ:

$ ls -1 | xargs echo file
file Hello World/

উপরে কল করা xargs এর {need প্রয়োজন হয় না} এটি কোনও স্থানধারক ছাড়াই কমান্ডের শেষে STDIN যুক্ত করে। {} এর ব্যবহারের অর্থ সাধারণত আপনি চাইছেন যে সেন্টিমিডির মাঝখানে কোথাও এসটিডিআইএন চালানো হোক, যেমন:

$ ls -1 | xargs -i mv {} /path/to/someplace/.

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