কোনও ফাইলের সামগ্রীর পরিবর্তে ফাইল নামের জন্য "গ্রেপ" কীভাবে করবেন?


135

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

উদাহরণস্বরূপ, আমি যদি সমস্ত ভিবি ফর্ম ফাইলগুলি খুঁজতে চাই যা "f" দিয়ে শুরু হয় এবং .frm এর সাথে শেষ হয়, আমি নিয়মিত প্রকাশটি ব্যবহার করব -

   "f[[:alnum:]]*\.frm"

গ্রেপ কি এটি করতে পারে? যদি তা না হয় তবে এমন কোনও ইউটিলিটি আছে যা আমাকে এই কাজটি করতে দেয়? ধন্যবাদ।

উত্তর:


120

এই ক্ষেত্রে findপরিবর্তে আপনার ব্যবহার করা উচিত grep

আপনি বা এর findসাথে সংমিশ্রণেও ব্যবহার করতে পারেন :grepegrep

$ find | grep "f[[:alnum:]]\.frm"

12
এটি অপ্রয়োজনীয়। -regexবিকল্পটির সাথে অন্তর্নির্মিত কার্যকারিতাটি সন্ধান করুন ।
Whereswalden

4
এটি এখানে অপ্রয়োজনীয়, তবে গ্রেপ পার্ল রেজেক্সকে সমর্থন করে যেখানে খুঁজে পাওয়া যায় না।
ড্যান

2
না, আপনি গ্রেপ ব্যবহার করতে পারেন। উপায় ব্যবহারের চেয়ে সহজ উপায়। "-Rl" স্যুইচটি যুক্ত করুন এবং এটি ফাইলের পরিবর্তে ফাইলের নাম অনুসন্ধান করবে। নীচে আমার পোস্ট দেখুন।
আরএম

@ আলফা_৯৯৯, আমি বলেছিলাম গ্রেপ এটিকে সমর্থন করে, যা এটি করে: gnu.org/software/grep/manual/html_node/… পয়েন্টটি গ্রাইপ- এ পাইপিং করা দরকার কেবল যদি আপনার পিসিসি প্রয়োজন হয়। Whereswalden সঠিক উত্তর আছে
ড্যান

60

উদাহরণ

find <path> -name *FileName*

ম্যানুয়াল থেকে:

নাম প্যাটার্ন

ফাইলের নামের ভিত্তি (অগ্রণী ডিরেক্টরিগুলি সরানো পথ) শেল প্যাটার্ন প্যাটার্নের সাথে মেলে। যেহেতু শীর্ষস্থানীয় ডিরেক্টরিগুলি সরানো হয়েছে, -নামের সাথে মিলের জন্য বিবেচিত ফাইলের নামগুলি কখনই স্ল্যাশকে অন্তর্ভুক্ত করবে না, সুতরাং "-name a / b" কখনই কোনও কিছুর সাথে মেলে না (পরিবর্তে আপনার সম্ভবত -পথ ব্যবহার করা দরকার)। মেটাচার্যাক্টর ("*", "?", এবং "[]") একটি "এর সাথে মেলে।" বেস নামের শুরুতে (এটি ফাইন্ডের ইউজ -২.২.২.২ এর পরিবর্তন; নীচে স্ট্যান্ডার্ডস কনফারেন্সের বিভাগটি দেখুন)। এর অধীন একটি ডিরেক্টরি এবং ফাইলগুলি উপেক্ষা করতে -প্রুন ব্যবহার করুন; -পথের বর্ণনায় একটি উদাহরণ দেখুন। বશેস সহ কয়েকটি শেল শেল নিদর্শনগুলির একটি বিশেষ অর্থ সহ ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধিরে যায় Bra ফাইলনেম ম্যাচিং fnmatch (3) লাইব্রেরি ফাংশন ব্যবহার করে সঞ্চালিত হয়। শেল দ্বারা সম্প্রসারণ থেকে রক্ষা করার জন্য প্যাটার্নটি উদ্ধৃতিতে আবদ্ধ করতে ভুলবেন না।


2
আমি এই উত্তরটি সবচেয়ে দরকারী বলে খুঁজে পেয়েছি। আমি কয়েকটি অতিরিক্ত বিকল্প যুক্ত করেছি: find . -maxdepth 1 -name "*filename*" -print
JSON C11

47

পাবলো যেমন বলেছিল, তার findপরিবর্তে আপনার ব্যবহার করা দরকার grep, তবে পাইপ findদেওয়ার দরকার নেই grepfindযে কার্যকারিতা অন্তর্নির্মিত হয়েছে:

find . -regex 'f[[:alnum:]]\.frm'

findনাম অনুসারে ফাইলগুলি সন্ধানের জন্য একটি অত্যন্ত শক্তিশালী প্রোগ্রাম এবং ফাইলের ধরণ অনুসারে অনুসন্ধানের পক্ষে, গভীরতার সীমাবদ্ধকরণকে, বুলিয়ান অপারেশনের সাথে বিভিন্ন অনুসন্ধানের পদগুলিকে একত্রিত করে এবং পাওয়া ফাইলগুলিতে স্বেচ্ছাসেবক আদেশগুলি কার্যকর করতে সহায়তা করে। দেখুন খোঁজ man পৃষ্ঠা দেখুন।


1
আমি তারিখে তারিখ অনুসারে অনুসন্ধান করার খুব সহজ বৈশিষ্ট্যটি যুক্ত করব -mtimeএবং-mmin
জনরাইড

1
এছাড়াও, -রেজেক্স স্যুইচ পুরো পথের সাথে ম্যাচগুলি সম্পাদন করে। কাজ করার জন্য উদাহরণটি যোগ করার দরকার।
tumasgiu

15

আপনি গ্রেপ ব্যবহার করে কোনও ফাইলের পুরো পথটি সন্ধান করতে পারেন, কেবল গাছের আউটপুটটি পাইপ করুন

tree -f | grep filename

এখানে আপনার ফাংশনটি আপনার .bash_profile বা .Bashrc এ রাখতে পারেন

findfile(){ tree -f | grep $1; } # $1 = filename, -f is full path

-f .চ্ছিক।
জেসনলোনহার্ড

10
find -iname "file_name"

Syntax :-
find -type type_descriptor file_name_here

টাইপ_ডেস্ক্রিপ্টরের ধরণ: -

চ: নিয়মিত ফাইল

d: ডিরেক্টরি

l: প্রতীকী লিঙ্ক

সি: অক্ষর ডিভাইস

বি: ব্লক ডিভাইস


1
আমি -type typedescriptorএকা অনুসরণ করে কোনও ফাইলের নাম ব্যবহার করতে পারি না বলে মনে হয় । এটা কি ভুল?
অ্যালান নারগার্ড

5

আপনি এটি করতে পারেন:

tree | grep filename

এটি অনুসন্ধানের জন্য গ্রেপ করতে ট্রি কমান্ডের আউটপুটটি পাইপ দেয়। এটি কেবল আপনাকে জানাবে যে ফাইলটি উপস্থিত রয়েছে কিনা।


1

না, গ্রেপ এর জন্য ঠিক কাজ করে:

 grep -rl "filename" [starting point]

 grep -rL "not in filename"

1
এটি "ফাইলের নাম" এর জন্য ফাইল সামগ্রী অনুসন্ধান করে, তারপরে ম্যাচের সাথে ফাইলগুলির নাম মুদ্রণ করে। ওপি ম্যাচের ফাইলের নাম চায়, ফাইলের সামগ্রী নয়।
ম্যাথু

1
সম্মত হয়েছে, এটি ফাইলের নাম অনুসন্ধান করে না, এটি কেবলমাত্র ফাইলের নামগুলি মুদ্রণ করে যার জন্য এটি সামগ্রীর সাথে মেলে। আপনি উভয় -lএবং -Lবিকল্প উভয়ই যথেষ্ট বোঝে।
প্রমিথিউস

2
আমার যা প্রয়োজন ঠিক তা হওয়ার জন্য +1 খুশী আমার যে উত্তরটি প্রয়োজন তার
সন্ধানের জন্য

-1

একাধিক ফাইলের জন্যও।

tree /path/to/directory/ | grep -i "file1 \| file2 \| file3"

-1

সবচেয়ে সহজ উপায়

find . | grep test

এখানে সন্ধান করুন (।) অর্থাৎ বর্তমান ডিরেক্টরিতে সমস্ত ফাইলকে পুনরাবৃত্তির সাথে তালিকাবদ্ধ করবে। এবং তারপরে এটি কেবল একটি সাধারণ গ্রেপ। নামের "টেস্ট" রয়েছে এমন সমস্ত ফাইল উপস্থিত হবে।

আপনি আপনার প্রয়োজন অনুযায়ী গ্রেপ সঙ্গে খেলতে পারেন। দ্রষ্টব্য: গ্রেপ যেমন জেনেরিক স্ট্রিংয়ের শ্রেণিবিন্যাস, এটি আপনাকে কেবল ফাইলের নামই দেয় না। তবে যদি কোনও পাথের ডিরেক্টরি থাকে ('/xyz_test_123/other.txt') ফলাফলের সেটও আসে। চিয়ার্স


এটি "পরীক্ষার" সাথে কিছুতে সন্ধান করবে যেমন, উদাঃ ./foo/bar/latest/fred.txt
পল আর

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