ফলাফলের সন্ধানে xargs ব্যবহার করার সময় আমি ফাইলের নামগুলিতে ফাঁকা স্থানগুলি কীভাবে পরিচালনা করতে পারি?


28

আমার প্রচলিত অভ্যাসগুলির মধ্যে একটি হ'ল একটি নির্দিষ্ট ধরণের সমস্ত ফাইলে গ্রেপ করা, যেমন, সমস্ত HTML ফাইলগুলিতে সন্ধান করুন যার মধ্যে "রাম্পাস" শব্দ রয়েছে have এটি করতে, আমি ব্যবহার করি

find /path/to -name "*.html" | xargs grep -l "rumpus"

মাঝেমধ্যে, findএর নামে কোনও স্থান সহ কোনও ফাইল ফেরত দেবে my new file.html। এটি xargsপাস করার পরে grep, তবে আমি এই ত্রুটিগুলি পাই:

grep: /path/to/bad/file/my: No such file or directory
grep: new: No such file or directory
grep: file.html: No such file or directory

আমি এখানে যা চলছে তা দেখতে পাচ্ছি: পাইপ বা xargsএটি ফাঁকা স্থানগুলিকে ফাইলগুলির মধ্যে ডিলিমিটার হিসাবে বিবেচনা করছে। আমার জীবনের জন্য, যদিও আমি কীভাবে এই আচরণটি আটকাতে পারি তা বুঝতে পারি না। এটি কি find+ দিয়ে করা যায় xargs? অথবা আমার কি সম্পূর্ণ ভিন্ন কমান্ড ব্যবহার করতে হবে?

উত্তর:


29

ব্যবহার

find ... -print0 | xargs -0 ...

যেমন

find /path/to -name "*.html"  -print0 | xargs -0  grep -l "rumpus"

ম্যান পৃষ্ঠা থেকে

-print0
          True; print the full file name on the standard  output,  followed
          by  a  null  character  (instead  of  the  newline character that
          ‘-print’ uses).  This allows file names that contain newlines  or
          other  types  of  white space to be correctly interpreted by pro-
          grams that process the find output.  This option  corresponds  to
          the ‘-0’ option of xargs.

15

আপনাকে xargs ব্যবহার করার দরকার নেই , কারণ অনুসন্ধানগুলি নিজেই আদেশগুলি কার্যকর করতে পারে। এটি করার সময়, আপনাকে নামের শেলটি ব্যাখ্যা করার শেল সম্পর্কে চিন্তা করতে হবে না।

find /path/to -name "*.html" -exec grep -l "rumpus" '{}' +

ম্যান পৃষ্ঠা থেকে

-exec কমান্ড {} + -exec ক্রিয়নের
এই রূপটি নির্বাচিত ফাইলগুলিতে নির্দিষ্ট কমান্ড চালায়, তবে প্রতিটি নির্বাচিত ফাইলের নাম শেষে অন্তর্ভুক্ত করে কমান্ড লাইনটি নির্মিত হয়; কমান্ডের অনুরোধের মোট সংখ্যা মিলিত ফাইলগুলির সংখ্যার তুলনায় অনেক কম হবে। কমান্ড লাইনটি একইভাবে নির্মিত হয়েছে যেমন xargs তার কমান্ড লাইনগুলি তৈরি করে। কমান্ডের মধ্যে কেবলমাত্র one {} 'এর একটি উদাহরণ অনুমোদিত। কমান্ডটি শুরু ডিরেক্টরিতে কার্যকর করা হয়।


আমি এটিকে উজ্জীবিত করব তবে আজকের জন্য আমার আর বাকী নেই - আমি আগামীকাল এটি করব।
ব্যবহারকারী 9517

1
@ আইইন - আপনি সেখানে যান (আমি সম্মতি জানাই, যাইহোক)
এডুয়ার্ডো ইভানেক

স্রেফ সন্ধান করে আপনি এখনও জার্গসের বৈশিষ্ট্যগুলি থেকে বাদ যান, এবং আপনার সাথে নির্বোধ উদ্ধৃতি সংক্রান্ত বিধিগুলিও মোকাবেলা করতে হয়। যদি আপনার একাধিক কোর / সিপিইউ থাকে তবে xargs- এর আর্গুমেন্ট দেখুন।
স্লারিটিবার্টফেস

8

যদি আপনার সিস্টেমে সংস্করণগুলি সন্ধান করে এবং xarg সংস্করণগুলি সমর্থন করে না -print0এবং -0স্যুইচ না করে (উদাহরণস্বরূপ AIX সন্ধান এবং xargs) আপনি এটি ব্যবহার করতে পারেন:

find /your/path -name "*.html" | sed 's/ /\\ /g' | xargs grep -l "rumpus"

এখানে সেড xargs এর জন্য ফাঁকা স্থানগুলি রক্ষা করার যত্ন নেবে।


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