পাইপযুক্ত xargs পরে পাইপিং কমান্ড


38

এইচপি-ইউএক্স ***** বি.11.23 ইউ ia64 **** সীমাহীন-ব্যবহারকারী লাইসেন্স

find . -type d -name *log* | xargs ls -la

সেই ডিরেক্টরিতে থাকা logসমস্ত ফাইল আমাকে ডিরেক্টরিগুলির নাম (ডিরেক্টরিতে অন্তর্ভুক্ত থাকে ) দেয়।

ডিরেক্টরি  /var/opt/SID/application_a/log/,  /var/opt/SID/application_b/log/,  /var/opt/SID/application_c/log/ইত্যাদি লগ ফাইল ধারণ করে।

আমি চাই যে দুটি সর্বশেষ দুটি লগফিল lsকমান্ড দ্বারা তালিকাবদ্ধ করা হোক , যা আমি সাধারণত ব্যবহার করি ls -latr | tail -2

আউটপুট এর কিছু হতে হবে ..

/var/opt/SID/application_a/log/
-rw-rw-rw-   1 user1    user1      59698 Jun 11  2013 log1
-rw-rw-rw-   1 user1    user1      59698 Jun 10  2013 log2
/var/opt/SID/application_b/log/
-rw-rw-rw-   1 user1    user1      59698 Jun 11  2013 log1
-rw-rw-rw-   1 user1    user1      59698 Jun 10  2013 log2
/var/opt/SID/application_c/log/
-rw-rw-rw-   1 user1    user1      59698 Jun 11  2013 log1
-rw-rw-rw-   1 user1    user1      59698 Jun 10  2013 log2

find . -type d -name *log* | xargs ls -la | tail -2আমাকে উপরের ফলাফলটি দেয় না। আমি যা পাই তা হ'ল find . -type d -name *log* | xargs ls -laকমান্ডের শেষ দুটি ফাইলের তালিকা ।

সুতরাং আমি পাইপ পরে কমান্ড পাইপ করতে পারেন xargs? উপরের ফরম্যাটে ফাইলগুলির ফলাফলের তালিকা পেতে আমি কীভাবে আরও জিজ্ঞাসা করব?

find . -type d -name *log* | xargs sh -c "ls -ltr | tail -10"

আমাকে বর্তমান ডিরেক্টরিতে দশটি ডিরেক্টরি নামের একটি তালিকা দেয় যা /var/opt/SIDহ'ল এবং তা আমিও চাই না।


2
আপনার *log*অন্যথায় শেলটি এটি প্রসারিত করবে উল্লেখ করা উচিত।
অ্যান্থন

সচেতন হোন যে sh -cকমান্ডের নামটি (প্যারামিটার 0) এটির দ্বিতীয় যুক্তি হিসাবে প্রত্যাশা করে, তাই আপনার সর্বদা করা উচিত find . -type d -name *log* | xargs sh -c "ls -ltr | tail -10" lstail( lstailশেষের দিকে লক্ষ্য করুন , যা $0তৈরি শেল হিসাবে কাজ করবে )। অন্যথায় আপনার ফলাফলের প্রথমটি সেই ভূমিকাটি পূরণ করবে এবং অব্যবহৃত হবে।
জোনাস

উত্তর:


57

তুমি অনেকটা সেখানে. আপনার শেষ কমান্ডে, আপনি ব্যবহার করতে পারেন -Iনা lsসঠিকভাবে

-I replace-str

    প্রারম্ভিক-আর্গুমেন্টগুলিতে স্ট্যান্ডার্ড ইনপুট থেকে পঠিত নামগুলি সহ প্রতিস্থাপন-স্ট্রিংয়ের ঘটনাগুলি প্রতিস্থাপন করুন। এছাড়াও, অব্যক্ত ফাঁকা স্থানগুলি ইনপুট আইটেমগুলি শেষ করে না; পরিবর্তে বিভাজক হ'ল নতুন লাইন চরিত্র। সূচিত করে -xএবং -L 1

সুতরাং, সাথে

find . -type d -name "*log*" | xargs -I {} sh -c "echo {}; ls -la {} | tail -2"

আপনি echoদিরের সন্ধান পাবেন find, তারপরে ls | tailএটি করুন।


খুঁজে। -প্রকার ডি-নাম " লগ " | xargs -I {} sh -c "প্রতিধ্বনি {}; ls -ltr {} | গ্রেপ-ই \" file_in | file_out \ "| পুচ্ছ -5" আমি এটি ব্যবহার করেছি।
anotherPress1

3
আমি যা করিxargs -n 1 sh -c 'echo $0'
জিনহিং

1
ম্যাকোজে প্রতিস্থাপনটি উদ্ধৃত কমান্ডের মধ্যে কাজ করে নি, তাই echo $0সহায়ক (এবং আরও বোঝা যায়)
এমপুনসেল

1
এটা স্পেস, ব্যবহার সঙ্গে ফাইলের নামের সাথে কাজ করতে -print0, xargs -0পালায় {}উদ্ধৃতি চিহ্ন মধ্যে ভিতরেsh কমান্ড প্রয়োগ করুন:find . -type d -name "*log*" -print0 | xargs -0 -I {} sh -c "echo \"{}\";ls -la \"{}\" | tail -2"
বেনেডিক্ট Köppel

আমি "xargs -n 1 sh -c" প্রতিধ্বনি \ $ 0 | ব্যবহার করি $ func "I যদি আমার $ ফানক চলক
god

5

জিএনইউ সমান্তরাল এই ধরণের কাজগুলি সহজ করে তোলে:

find . -type d -name "*log*" | parallel --tag "ls -la {} | tail -2"

আপনি যদি জিএনইউ সমান্তরাল একটি সম্পূর্ণ ইনস্টল করতে না চান তবে আপনি একটি ন্যূনতম ইনস্টলেশন করতে পারেন: http://git.savannah.gnu.org/cgit/parallel.git/tree/README


2

ফ্রেডট্যান্টিনি ছাড়াও এবং সাধারণ ব্যাখ্যা হিসাবে (যেহেতু ডক্সটি কিছুটা বিভ্রান্তিকর)

xargs -I {}স্ট্যান্ডার্ড ইনপুট থেকে '{}' অক্ষর গ্রহণ করা এবং তাদের যাই হোক না কেন নল থেকে আসে সঙ্গে প্রতিস্থাপন করবে। এর অর্থ আপনি যে {}কোনও চরিত্রের সংমিশ্রণটির সাথে প্রতিস্থাপন করতে পারেন (সম্ভবত আপনার পছন্দসই প্রোগ্রামিংয়ের স্বাদে আরও ভাল স্যুট করতে পারেন)। উদাহরণস্বরূপ : xargs -I % sh -c "echo %"। আপনি যদি সর্বদা এটি ব্যবহার করেন তবে xargs -I {}আপনি এটি সংক্ষিপ্তরূপে প্রতিস্থাপন করতে পারেন xargs -i

এটি sh -cআপনার বাশ / শেলকে স্ট্যান্ড থেকে পরবর্তী কমান্ডটি স্ট্যান্ডার্ড ইনপুট থেকে পড়তে বলবে। সুতরাং লেখার sh -c "echo something"সমতুল্য echo something

xargs -I {} sh -c "echo {}"ইনপুট আপনার তৈরি করা সঙ্গে পড়তে হবে sh -cযা echo {}। যেহেতু আপনি এটি {}পাইপ থেকে পেয়েছেন সেই যুক্তিগুলির সাথে প্রতিস্থাপন করতে বলেছিলেন , তাই হবে।

আপনি পাইপ ছাড়াই সহজে এটি পরীক্ষা করতে পারেন, কেবলমাত্র টার্মিনালে উপরের কমান্ডটি টাইপ করুন। আপনি পরবর্তী যাই লিখুন তা টার্মিনালে আউটপুট হবে (প্রস্থান করতে Ctrl-D)।

ইন ls -la {}কমান্ড একই জিনিস আবার ঘটবে। {}প্রাক পাইপ কমান্ড লিখিত সামগ্রীর প্রতিস্থাপিত হয়।

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