"অনুসন্ধান" ব্যবহার করে নির্দিষ্ট ফাইলের নাম উপেক্ষা করবেন কীভাবে?


143

আমার পছন্দের BASH কমান্ডগুলির মধ্যে একটি:

find . -name '*.*' -exec grep 'SearchString' {} /dev/null \;

যা নির্দিষ্ট অনুসন্ধান স্ট্রিংয়ের জন্য বর্তমান ডিরেক্টরিতে এবং নীচে সমস্ত ফাইলের বিষয়বস্তু অনুসন্ধান করে। বিকাশকারী হিসাবে, এটি সময়ে সময়ে কাজে আসে।

আমার বর্তমান প্রকল্প এবং আমার কোডবেসের কাঠামোর কারণে, তবে আমি ".svn" ডিরেক্টরিতে বা এর নিচে থাকা কোনও ফাইল বা অন্য কোনও ফাইল অনুসন্ধান না করে এই বেস কমান্ডটিকে আরও উন্নত করতে চাই ".html" দিয়ে শেষ

ধরণের ধরণের সন্ধানের জন্য মানব পৃষ্ঠাটি যদিও আমাকে বিভ্রান্ত করেছে। আমি -প্রিন ব্যবহার করার চেষ্টা করেছি এবং এটি আমাকে অদ্ভুত আচরণ দিয়েছে। কেবলমাত্র .html পৃষ্ঠাগুলি এড়িয়ে যাওয়ার প্রয়াসে (শুরু করতে), আমি চেষ্টা করেছি:

find . -wholename './*.html' -prune -exec grep 'SearchString' {} /dev/null \;

এবং আমার যে আচরণের প্রত্যাশা ছিল তা পান নি। আমি মনে করি আমি সম্ভবত প্রিন্টের বিন্দুটি মিস করছি। আপনি কি আমাকে সাহায্য করতে পারেন?

ধন্যবাদ


1
জাস্ট ফাই: findবিল্ড-ইন বাশ কমান্ড নয় বরং একটি পৃথক প্রোগ্রাম
ওয়াকিমিকো

1
আপনি ভিতরে ফাইল অনুসন্ধান করতে পারেন সঙ্গেgrep -rl 'SearchString'
Emanuele

@ ইমানুয়েল হাই, সুপারউজারে (এবং স্ট্যাক এক্সচেঞ্জ নেটওয়ার্ক) আপনাকে স্বাগতম। এটি আমি জিজ্ঞাসা করা একটি প্রশ্ন এবং এর উত্তর দেওয়া হয়েছিল, ২/৩ বছর আগে। সাধারণত, যদি আপনি প্রশ্নের উত্তর যুক্ত করতে চান তবে দয়া করে কোনও মন্তব্য না করে নীচে স্ক্রোল করে সেখানে উত্তর দিয়ে করুন। যেহেতু এই প্রশ্নের ইতিমধ্যে একটি স্বীকৃত উত্তর রয়েছে (সবুজ চেকমার্ক সহ একটি), তবে আপনার উত্তরটি খুব বেশি মনোযোগ পাবে বলে সম্ভাবনা কম। অবগতির জন্য।
কোডি এস

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

2
এফডাব্লুআইডাব্লু, সমস্ত ফাইল -name '*.*'সন্ধান করে না : কেবলমাত্র তাদের নামের সাথে (তাদের ব্যবহার সাধারণত ডস-ইসম হয়, তবে ইউনিক্সে আপনি সাধারণত তার জন্য ব্যবহার করেন )। সত্যিই তাদের সাথে মেলাতে করার জন্য, শুধু পুরাপুরি যুক্তি সরান: । অথবা আপনি যদি কেবলমাত্র ফাইলগুলিতে গ্রেপ প্রয়োগ করতে চান (এবং ডিরেক্টরিগুলি এড়িয়ে যান) তবে তা করুন । .*.**find . -exec ...find . -type f -exec ...
স্টিফান

উত্তর:


197

নির্দিষ্ট নামের সাথে ফাইলের মিল না নেওয়ার জন্য আপনি নেগেট (!) বৈশিষ্ট্যটি ব্যবহার করতে পারেন:

find . ! -name '*.html' ! -path '*.svn*' -exec grep 'SearchString' {} /dev/null \;

সুতরাং যদি নামটি। Html এ শেষ হয় বা পথের যে কোনও জায়গায় .svn থাকে তবে এটি মেলে না এবং তাই এক্সিকিউটটি কার্যকর করা হবে না।


1
আমি এখনও নাম উল্লেখ করা উচিত ' 'সেখানে কোথাও? আমি কি আগে তা করব নাকি অবহেলার পরে?
কোডি এস

আপনার *.*ম্যাচের উদ্দেশ্যটি কি কেবল এটির সাথে থাকা ফাইলগুলির সাথে মেলে তা নিশ্চিত করার জন্য .? কোনও nameনির্দেশকের অভাবে সমস্ত ফাইলের সাথে মিল মিলবে , সুতরাং উপরের এইচটিএমএল এবং এসএনএন বাদে সমস্ত কিছুর সাথে মিলবে
পল

5
আমি মনে করি আপনি -wholename '*.svn*'বরং চান -name
ফুয়েনফুন্ডাচজিগ

2
হ্যাঁ, এটি করে, যাতে .svnডিরেক্টরিগুলি অনুসন্ধান ফলাফল থেকে বাদ দেওয়া হয়।
ফুয়েনফুন্ডাচজিগ

1
@ নুমেননের ফলাফল ফলাফল থেকে ! -name '.'বাদ .দেওয়া উচিত ।
পল

11

আমি দীর্ঘদিন ধরে একই সমস্যা পেয়েছি এবং বেশ কয়েকটি সমাধান রয়েছে যা বিভিন্ন পরিস্থিতিতে প্রযোজ্য:

  • ack-grep"বিকাশকারী" এর এক ধরণের grepযা ডিফল্টরূপে সংস্করণ নিয়ন্ত্রণ ডিরেক্টরি এবং অস্থায়ী ফাইলগুলি এড়িয়ে যায়। manপৃষ্ঠাটি কেবল নির্দিষ্ট ধরনের ফাইল অনুসন্ধান করতে কিভাবে এবং কিভাবে ব্যাখ্যা করে আপনার নিজের সংজ্ঞায়িত
  • grepফাইলগুলির গ্লোব এবং একক ডিরেক্টরিগুলি (দুর্ভাগ্যক্রমে, ডিরেক্টরিগুলির জন্য কোনও গ্লোব্বিং নেই) এড়াতে খুব সহজেই নিজস্ব --excludeএবং --exclude-dirবিকল্পগুলি ব্যবহার করা যেতে পারে ।
  • find . \( -type d -name '.svn' -o -type f -name '*.html' \) -prune -o -print0 | xargs -0 grep ... কাজ করা উচিত, তবে উপরের বিকল্পগুলি সম্ভবত দীর্ঘকালীন ঝামেলা কম।

9

নিম্নলিখিত findকমান্ডটি ছাঁটাই ডিরেক্টরিগুলি করে যার নামগুলি রয়েছে .svn , যদিও এটি ডিরেক্টরিতে না আসে, ছাঁটাইযুক্ত পথের নামটি মুদ্রিত হয় ... ( -name '*.svn'কারণ!) ..

আপনি এর মাধ্যমে ডিরেক্টরিগুলির নামগুলি ফিল্টার করতে পারবেন: grep -d skipযা নিঃশব্দে এই জাতীয় ইনপুট "ডিরেক্টরি নামগুলি" এড়িয়ে যায়।

GNU গ্রেপ সহ, আপনি -Hপরিবর্তে ব্যবহার করতে পারেন /dev/null। সামান্য পার্শ্ব সমস্যা হিসাবে: \+তুলনায় অনেক দ্রুত হতে পারে \;। 1 মিলিয়ন এক-লাইন ফাইলের জন্য, \;এটি ব্যবহার করে 4m20 সেকেন্ড লেগেছে , \+এটি ব্যবহার করে এটি কেবল 1.2 টি নিয়েছে

নিম্নলিখিত পদ্ধতিটি xargsপরিবর্তে ব্যবহার করে -execএবং ধরে নেওয়া \nহয় যে আপনার কোনও ফাইলের নামের কোনও নতুনলাইন নেই । এখানে যেমন ব্যবহার করা হয়েছে xargsতেমন সন্ধানের মতোই \+

xargsবিকল্পের '\n'সাথে ইনপুট ডিলিমিটারটি পরিবর্তন করে ক্রমাগত ফাঁকা স্থান রয়েছে এমন ফাইল-নামগুলি পাস করতে পারে -d

এটি এমন ডিরেক্টরিগুলি বাদ দেয় যাদের নামগুলি থাকে.svn এবং কেবল শেষ হয় না এমন ফাইলগুলি গ্রেপ করে .html

find . \( -name '*.svn*' -prune  -o ! -name '*.html' \) |
   xargs -d '\n' grep -Hd skip 'SearchString'

1
\+এক্সেকশন কর্মের বৈকল্পিকটি নির্দেশ করার জন্য আপনাকে ধন্যবাদ । সামান্য পক্ষের জন্য হুর!
খ্রিস্টান লং

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