Xargs কেন প্রয়োজনীয়?


25

মনে করুন আমি "নোট.টিএসটিএসটি" নামের একটি ব্যতীত ডিরেক্টরিতে সমস্ত ফাইল সরিয়ে দিতে চাই। আমি পাইপলাইন দিয়ে এটি করব ls | grep -v "notes.txt" | xargs rm,। দ্বিতীয় পাইপের আউটপুট যদি আরএম ব্যবহার করা হয় তবে আমার কেন xargs দরকার?

তুলনার খাতিরে পাইপলাইন, echo "#include <knowledge.h>" | cat > foo.cxargs ব্যবহার ছাড়াই প্রতিধ্বনিত পাঠ্যটি ফাইলটিতে সন্নিবেশ করায়। এই দুটি পাইপলাইনের মধ্যে পার্থক্য কী?


3
আপনার ls | grep -v "notes.txt" | xargs rmব্যতীত সমস্ত কিছুই সরানোর জন্য ব্যবহার করা উচিত নয় notes.txtবা সাধারণভাবে কখনই lsআউটপুটকে বিশ্লেষণ করতে পারে না । উদাহরণস্বরূপ, যদি কোনও একক ফাইলের মধ্যে একটি জায়গা থাকে তবে আপনার আদেশটি ভঙ্গ হবে। নিরাপদ উপায়ে rm !(notes.txt)বাশ ( shopt -s extglobসেট সহ), বা rm ^notes.txtজেডশ (সহ EXTENDED_GLOB) ইত্যাদি হবে

স্থানগুলি এড়াতে আপনি :-) এর find . -maxdepth 1 -mindepth 1 -print0 | xargs -0পরিবর্তে করতে পারেনls | xargs
ফ্লাব করুন

উত্তর:


35

আপনি দুটি খুব ভিন্ন ধরণের ইনপুট বিভ্রান্ত করছেন: STDIN এবং যুক্তি। আর্গুমেন্টগুলি কমান্ডের শুরু হওয়া স্ট্রিংয়ের একটি তালিকা যা সাধারণত কমান্ডের নাম (যেমন echo these are some argumentsবা rm file1 file2) এর পরে নির্দিষ্ট করে থাকে । অন্যদিকে, স্টাডিন হ'ল বাইটের একটি ধারা (কখনও কখনও পাঠ্য, কখনও কখনও না) যা কমান্ডটি শুরু করার পরে (allyচ্ছিকভাবে) পড়তে পারে। এখানে কয়েকটি উদাহরণ দেওয়া আছে (নোট যেটি catআর্গুমেন্ট বা STDIN নিতে পারে তবে এটি তাদের সাথে বিভিন্ন জিনিস করে):

echo file1 file2 | cat    # Prints "file1 file2", since that's the stream of
                          # bytes that echo passed to cat's STDIN
cat file1 file2    # Prints the CONTENTS of file1 and file2
echo file1 file2 | rm    # Prints an error message, since rm expects arguments
                         # and doesn't read from STDIN

xargs STDIN- স্টাইল ইনপুটকে আর্গুমেন্টে রূপান্তরকারী হিসাবে ভাবা যেতে পারে:

echo file1 file2 | cat    # Prints "file1 file2"
echo file1 file2 | xargs cat    # Prints the CONTENTS of file1 and file2

echo আসলে কম-বেশি বা বিপরীতটি খুব কম করে: এটি তার যুক্তিগুলিকে STDOUT- এ রূপান্তর করে (যা অন্য কোনও কমান্ডের STDIN এ পাইপ করা যেতে পারে):

echo file1 file2 | echo    # Prints a blank line, since echo doesn't read from STDIN
echo file1 file2 | xargs echo    # Prints "file1 file2" -- the first echo turns
                                 # them from arguments into STDOUT, xargs turns
                                 # them back into arguments, and the second echo
                                 # turns them back into STDOUT
echo file1 file2 | xargs echo | xargs echo | xargs echo | xargs echo    # Similar,
                                 # except that it converts back and forth between
                                 # args and STDOUT several times before finally
                                 # printing "file1 file2" to STDOUT.

9

catথেকে ইনপুট নেয় STDINএবং rmনা। এই জাতীয় কমান্ডগুলির জন্য আপনাকে লাইন বাই লাইন xargsদিয়ে পুনরাবৃত্তি করতে হবে STDINএবং কমান্ড লাইন পরামিতিগুলি সহ কমান্ডগুলি কার্যকর করতে হবে।

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