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.