সন্ধান করুন:-এক্সেক বনাম xargs (ওরফে "সন্ধান করে কেন? xargs বেস নাম" বিরতি?)


10

আমি উপ-ডিরেক্টরিগুলিতে ছড়িয়ে থাকা একটি নির্দিষ্ট ধরণের সমস্ত ফাইল সন্ধান করার চেষ্টা করছিলাম এবং আমার প্রয়োজনে কেবলমাত্র ফাইলের নাম প্রয়োজন needed আমি এর মাধ্যমে পথের উপাদানটি সরিয়ে নেওয়ার চেষ্টা করেছি basename, তবে এটি এর সাথে কার্যকর হয়নি xargs:

$ find . -name '*.deb' -print | xargs basename 
basename: extra operand `./pool/main/a/aalib/libaa1_1.4p5-37+b1_i386.deb'
Try `basename --help' for more information.

আমি এই উভয় প্রকরণের সাথে একই জিনিস (ঠিক একই ত্রুটি) পেয়েছি:

$ find . -name '*.deb' -print0 | xargs -0 basename 
$ find . -name '*.deb' -print | xargs basename {}

এটি অন্যদিকে প্রত্যাশার মতো কাজ করে:

$ find . -name '*.deb' -exec basename {} \;
foo
bar
baz

এটি আপ টু ডেট সাইগউইন এবং ডেবিয়ান 5.0.3 এ ঘটে। আমার নির্ণয়টি হ'ল যে জার্সগুলি কোনও কারণে বেসনামে দুটি ইনপুট লাইনগুলি প্রেরণ করে তবে কেন? এখানে কি হচ্ছে?

উত্তর:


23

কারণ basenameকেবল একটি প্যারামিটার চায় ... প্রচুর নয়। এবং xargsপ্রচুর পরামিতি তৈরি করে।

আপনার আসল সমস্যাটি সমাধান করতে (কেবলমাত্র ফাইলের নাম তালিকাভুক্ত করুন):

 find . -name '*.deb' -printf "%f\n"

কোনটি কেবল 'বেসনাম' মুদ্রণ করে (মানুষ খুঁজে বের করে):

 %f     File's name with any leading directories
        removed (only the last element).

1
ওহো .... / আবার কপালে চড়
মারল

আমি ভেবেছিলাম বিন্দুটি xargsহ'ল এটি আর্গুমেন্টের একটি তালিকা তৈরি করে এবং প্রতিটির পরে যে কমান্ডটি আসবে তা ফিড করে? অন্যথায় যে এবং এর মধ্যে পার্থক্য কি find . -name '*.deb' | basename?
উইন্ডোজমেকার

জিএনইউ বেসনেমে এখন একটি -aবিকল্প রয়েছে: "একাধিক যুক্তি সমর্থন করুন এবং প্রত্যেককে একটি নাম হিসাবে বিবেচনা করুন"।
বিশপ

1
@ উইন্ডোজমেকার কমান্ড আর্গুমেন্টে xargsরূপান্তরিত stdinকরে। একটি উপায়ে, এটি এর বিপরীত echo, যা তার যুক্তিগুলিকে রূপান্তর করে stdout। মধ্যে পার্থক্য find ... | xargs -n1 basenameবা find ... | xargs basename -aএবং find ... | basenameযে সাবেক দুই বাস্তবায়নের সঙ্গে কাজ করবে হয় basenameযে উপেক্ষা করা stdin
বিট্রি

19

এটা চেষ্টা কর:

find . -name '*.deb' | xargs -n1 basename

এটি ব্যাখ্যা নয়, এটি একটি কার্যবিবরণী। এবং কর্মক্ষেত্রটি পাওয়া যায় এমন কোনও ফাইলের জন্য -exec- এর মাধ্যমে 'বেসনাম' বলার মতোই দুর্দান্ত।
আকির

4
+1 ... কোনও ব্যাখ্যা না দিয়ে, এটি আপনাকে দেখানো এক্সআরজেস স্যুইচটি তদন্ত করতে পরিচালিত করবে, যা শেষ পর্যন্ত আমাকে কপাল-চড়
মারার

1
এইভাবেই আমি এটি করি। findকমান্ডের সমস্ত ইনস এবং আউটস শিখার মতো মনে হয় না , তাই আমি কেবল এটি ফাইল সন্ধান এবং তালিকার জন্য ব্যবহার করি এবং আমি অন্য কিছুর জন্য xargs ব্যবহার করি।
রায়ান সি থম্পসন

4

বেসনেম শুধুমাত্র একটি যুক্তি গ্রহণ করে। -execসঠিকভাবে কাজ করে কারণ প্রত্যেকের {}বর্তমান ফাইলের নামটি প্রক্রিয়াজাত করা হচ্ছে, এবং কমান্ডটি একবারে মিলিয়ে ফাইলের পরিবর্তে সমস্ত যুক্তি এক সাথে বেসনেমে পাঠানোর চেষ্টা না করে চালানো হবে।


3

xargs কেবল একটি যুক্তি পাস করতে বাধ্য করা যেতে পারে ...

find . -name '*.deb' -print | xargs -n1 basename

এটি কাজ করে তবে স্বীকৃত উত্তরটি findআরও উপযুক্ত উপায়ে ব্যবহার করছে। আমি xargs basenameফাইলের অবস্থানের তালিকা পেতে অন্য কমান্ডটি ব্যবহার করায় সমস্যার সমাধানের জন্য এই প্রশ্নটি খুঁজে পেয়েছি । এর -n1পতাকা xargsআমার জন্য চূড়ান্ত উত্তর ছিল।

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