জটিল অনুসন্ধানের জন্য কীভাবে একত্রিত হন এবং গ্রেপ করবেন? (জিএনইউ / লিনাক্স, সন্ধান করুন, গ্রেপ)


17

আমি এমন কিছু ফাইলগুলিতে একটি পাঠ্য অনুসন্ধান করার চেষ্টা করছি যা জিএনইউ / লিনাক্সে অনুরূপ ডিরেক্টরি কাঠামো ভাগ করে নিলেও একই ডিরেক্টরি ট্রিতে নয়।

আমার কাছে অনেকগুলি ওয়েবসাইটের সাথে একটি ওয়েব সার্ভার রয়েছে যা একই গাছের কাঠামো ভাগ করে দেয় (কোড ইগনিটার এমভিসি পিএইচপি ফ্রেমওয়ার্ক), তাই আমি প্রতিটি সাইটের জন্য গাছের নিচে একটি নির্দিষ্ট ডিরেক্টরি অনুসন্ধান করতে চাই, উদাহরণস্বরূপ:

/srv/www/*/htdocs/system/application/

যেখানে * সাইটের নাম। এবং সেই অ্যাপ্লিকেশন ডিরেক্টরিগুলি থেকে, আমি তার গাছের নীচে সমস্ত গাছ সন্ধান করতে চাই, একটি *। Php ফাইলের জন্য যেটির ভিতরে কিছু পাঠ্য প্যাটার্ন রয়েছে, আসুন "ডিবাগ (" বলুন, কোনও নিয়মিত অভিব্যক্তির প্রয়োজন নেই)।

আমি কীভাবে সন্ধান এবং গ্রেপ ব্যবহার করতে হয় তা জানি তবে সেগুলি একত্রিত করার ক্ষেত্রে আমি ভাল না।

আমি এই কিভাবে করব?
আগাম ধন্যবাদ!

উত্তর:


21

চেষ্টা

find /srv/www/*/htdocs/system/application/ -name "*.php" -exec grep "debug (" {} \; -print

এটি এক্সটেনশন applicationসহ ফাইলগুলির জন্য পুনরাবৃত্তভাবে ফোল্ডারগুলি অনুসন্ধান করতে .phpএবং এগুলিতে প্রেরণ করা উচিত grep

এটি সম্পর্কে একটি অপ্টিমাইজেশন হ'ল কার্যকর করা:

find /srv/www/*/htdocs/system/application/ -name "*.php" -print0 | xargs -0 grep -H "debug ("

এটি একটি একক কমান্ডের আর্গুমেন্ট হিসাবে xargsসমস্ত .phpফাইল আউটপুট পাস করতে ব্যবহার করে ; যেমন ,। বিকল্প এবং বিকল্প ফাইল এবং ডিরেক্টরির নাম স্পেস নিশ্চিত সঠিকভাবে পরিচালনা করা হয়। বিকল্প প্রেরণ নিশ্চিত করে যে ফাইলের নাম সব পরিস্থিতিতে ছাপা হয়। (ডিফল্টরূপে, একাধিক যুক্তি পাস করার সময় কেবল ফাইলের নাম মুদ্রণ করে))findgrepgrep "debug (" file1 file2 file3-print0find-0xargs-Hgrepgrep

ম্যান xargs থেকে:

-0

      ইনপুট আইটেমগুলি সাদা স্থানের পরিবর্তে নাল অক্ষর দ্বারা সমাপ্ত করা হয়, এবং উদ্ধৃতি এবং ব্যাকস্ল্যাশ বিশেষ নয় (প্রতিটি অক্ষর আক্ষরিক অর্থে নেওয়া হয়)। ফাইল স্ট্রিংয়ের শেষটি অক্ষম করে, যা অন্য কোনও যুক্তির মতো আচরণ করা হয়। ইনপুট আইটেমগুলিতে সাদা স্থান, উদ্ধৃতি চিহ্ন, বা ব্যাকস্ল্যাশ থাকতে পারে তখন দরকারী। জিএনইউ অনুসন্ধান -print0বিকল্পটি এই মোডের জন্য উপযুক্ত ইনপুট উত্পাদন করে।


1
+1 টি। যদিও এটি প্রতিটি পিএইচপি ফাইলের জন্য গ্রেপ কার্যকর করবে। যদি প্রচুর ফাইল থাকে তবে আপনি আরও অপ্টিমাইজ করতে পারেনfind /srv/www/*/htdocs/system/application/ -name "*.php" -print0 | xargs -0 grep "debug ("
Jukka Matilainen

@ জ্যাক্কেম সম্মত আমি আমার উত্তর অনুসারে আপডেট করব।
নাগুল

2
আরেকটি ছোট উন্নতি: xargs কেবল একটি ফাইলের নাম গ্রেপকে দিতে পারে, এই ক্ষেত্রে গ্রেপ কোনও মিল থাকলে ফাইলের নাম প্রদর্শন করবে না। ফাইলের নামটি প্রদর্শন করতে বাধ্য করার জন্য আপনি গ্রেপ কমান্ড -H যুক্ত করতে চাইতে পারেন।
র‌্যান্ডি অরিসন

@ র্যান্ডি এটি খুব বৈধ পয়েন্ট।
নাগুল

3
এটি সত্য উদ্বেগজনক, তবে একই ধরণের একক প্রক্রিয়া সম্পাদন করার পরিবর্তে অপারেটরটিকে GNU findনিতে পারে। সুতরাং, এই উত্তরের উদাহরণ হিসাবে একই জিনিসটি করে , তবে একটি কম প্রক্রিয়া কাঁটাচামচ দিয়ে (এবং এখনও ফাইলের নাম সমস্যাগুলির জন্য 0 ঝুঁকি)। +\;xargsfind /srv/www/*/htdocs/system/application/ -name "*.php" -exec grep -H "debug (" {} +xargs
ড্যানিয়েল অ্যান্ডারসন

10

findএমনকি এই উদাহরণের জন্য প্রয়োজন হয় না, কেউ grepসরাসরি (কমপক্ষে GNU grep) ব্যবহার করতে পারে :

grep -RH --include='*.php' "debug (" /srv/www/*/htdocs/system/application/

এবং আমরা একটি একক প্রক্রিয়া কাঁটাচামচ।

বিকল্প:

  • -R, --dereference-recursive Read all files under each directory, recursively. Follow all symbolic links, unlike -r.
  • -H, --with-filename Print the file name for each match. This is the default when there is more than one file to search.
  • --include=GLOB Search only files whose base name matches GLOB (using wildcard matching as described under --exclude).
  • --exclude=GLOB Skip any command-line file with a name suffix that matches the pattern GLOB, using wildcard matching; a name suffix is either the whole name, or any suffix starting after a / and before a +non-/. When searching recursively, skip any subfile whose base name matches GLOB; the base name is the part after the last /. A pattern can use *, ?, and [...] as wildcards, and \ to quote a wildcard or backslash character literally.

শুধু কৌতূহলের জন্য, -RHবিকল্পগুলির অর্থ কী?
গস

@ গুস: man grepপোস্টে বিকল্প বর্ণনার সংক্ষিপ্তসার যোগ করা হয়েছে।
ড্যানিয়েল অ্যান্ডারসন

0

আপনার শেলটি পিএইচপি ফাইলগুলি সন্ধান করতে পারে এবং গ্রেপগুলিতে দিতে পারে। ব্যাশে:

shopt -s nullglob globstar
grep searchterm /srv/www/*/htdocs/system/application/**/*.php
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.