স্ট্রিংযুক্ত নামের সমস্ত ফাইল সন্ধান করুন


177

আমি এমন একটি কমান্ড সন্ধান করছি যা বর্তমান ডিরেক্টরি থেকে ফাইলগুলি ফেরত দেবে যা ফাইলের নামের একটি স্ট্রিং রয়েছে। আমি দেখেছি locateএবং findআদেশ দিয়েছি যে ফাইলগুলি কিছু থেকে শুরু করে first_word*বা কোনও কিছুর সাথে শেষ হতে পারে *.jpg

ফাইল নামের একটি স্ট্রিং রয়েছে এমন ফাইলগুলির একটি তালিকা আমি কীভাবে ফিরিয়ে দেব?

উদাহরণস্বরূপ, যদি 2012-06-04-touch-multiple-files-in-linux.markdownবর্তমান ডিরেক্টরিতে কোনও ফাইল ছিল।

আমি কীভাবে এই ফাইলটি এবং অন্যান্যগুলিতে স্ট্রিংটি যুক্ত করতে touchপারি? যেমন একটি কমান্ড ব্যবহার করেfind '/touch/'


প্রশ্ন বিভ্রান্তিকর। আপনি কি এমন ফাইলগুলি সন্ধান করতে চান যার একটি স্ট্রিং রয়েছে বা যেগুলির নামগুলিতে স্ট্রিং রয়েছে এমন ফাইলগুলি ? প্রথম প্রশ্নের উত্তর দেওয়া হয় man grep, দ্বিতীয়টি দিয়ে man find। কেন আপনি মানুষ ব্যবহার করার পরিবর্তে গুগল করবেন, আমি জানি না।
মাত্র

1
ধন্যবাদ! প্রথম বাক্যটি ফাইলের সামগ্রী বা কোনও ফাইলের নাম কিনা তা নির্দিষ্ট করে নি। আপডেট করা হয়েছে।
Dru

উত্তর:


303

ব্যবহার find:

find . -maxdepth 1 -name "*string*" -print

এটি বর্তমান ডিরেক্টরিতে সমস্ত ফাইল খুঁজে পাবে ( maxdepth 1যদি আপনি এটি পুনরাবৃত্ত করতে চান তবে মুছুন ) "স্ট্রিং" রয়েছে এবং এটি স্ক্রিনে মুদ্রণ করবে।

আপনি যদি ':' যুক্ত ফাইলটি এড়াতে চান তবে আপনি টাইপ করতে পারেন:

find . -maxdepth 1 -name "*string*" ! -name "*:*" -print

আপনি যদি ব্যবহার করতে চান grepতবে (তবে আমি মনে করি যতদূর আপনি ফাইলের সামগ্রী চেক করতে চান না এটি প্রয়োজনীয় নয়) আপনি ব্যবহার করতে পারেন:

ls | grep touch

তবে, আমি পুনরায় বলছি, findএটি আপনার কাজের জন্য একটি ভাল এবং ক্লিনার সমাধান।


ধন্যবাদ @ জাগোরাক্স। এটি ঠিক এটা করে। কমান্ডটি এত দীর্ঘ না হলেও আয়েই হোক :)
ড্রু

2
@ ড্রু, যদি আপনি কলোনগুলি এড়াতে চান তবে কেসটি কভার করতে পরিবর্তিত। findএটি একটি খুব শক্তিশালী সরঞ্জাম, এটি অবশ্যই কোনওভাবে 'দীর্ঘ' হওয়া উচিত। :)
জাগোরাক্স

ধন্যবাদ প্রথম কোনও বিষয়বস্তু না ফিরিয়ে নিখুঁতভাবে এটি করেছে।
Dru

3
@ ড্রু, আপনি যদি এটি 'সংক্ষিপ্ত' চান তবে আপনি এড়াতে পারবেন -printকারণ এটি ডিফল্ট আচরণ এবং .এটি এটির ডিফল্ট ফোল্ডার হিসাবে এটি পরীক্ষা করে।
জাগোরাক্স

1
find . -name "*string*"দুর্দান্ত কাজ করে। সরানো .আমার শেষের দিকে একটি ত্রুটি ছুড়ে ফেলে। আবার জাগোরাক্স ধন্যবাদ।
দ্রু

14

নীচে গ্রেপ ব্যবহার করুন:

grep -R "touch" .

-Rঅর্থ পুনরাবৃত্তি। আপনি যদি বরং সাব-ডিরেক্টরিতে না যেতে চান তবে এড়িয়ে যান।

-iএর অর্থ "কেস উপেক্ষা করুন"। আপনি এটি চেষ্টা করেও দেখতে পারেন।


গ্রেট। আমি লক্ষ্য করেছি যে কিছু ফাইলের বিষয়বস্তু অনুসরণ করে a :। তা কি আটকাতে হবে? সম্ভবত একটি বিকল্প ব্যবহার করছেন?
Dru

1
চেষ্টা করুন:grep -R "touch" . | cut -d ":" -f 2
carlspring

এটি কেবল ফাইলগুলির সামগ্রী তৈরি করে বলে মনে হচ্ছে। আপনি মূলত আমার প্রশ্নের উত্তর দিয়েছেন যদিও, বিষয়বস্তু আটকাতে কিছু খনন করার চেষ্টা করতে পারি।
Dru

আহ ... আপনার কেবল ফাইলের নাম দরকার? চালান: grep -R "touch" . | cut -d ":" -f 1 (দুঃখিত অবশ্যই আপনাকে ভুল বুঝে ফেলেছে)।
carlspring

ধন্যবাদ @ কার্লস্প্রিং এটি আকর্ষণীয়। grepহয় বিষয়বস্তু এবং ফাইলের নাম সম্বলিত ফাইলগুলির ফাইল touchবা ফাইলগুলি ফেরত দেয় touch, আমি নিশ্চিত না যে কোনটি ক্ষেত্রে, এখনও। ফিরিয়ে দেওয়া ফাইলগুলির তালিকার মধ্যে অর্ধেক touchশিরোনামে থাকে এবং বাকী অর্ধেক touchশরীরে থাকে, শিরোনাম নয়। ঠিক এই উপলব্ধি।
Dru


3
find $HOME -name "hello.c" -print

এটি "(হ্যালো। সি") নামের যে কোনও ফাইলের জন্য পুরো $HOME(যেমন /home/username/) সিস্টেমটি অনুসন্ধান করবে এবং তাদের পথের নামগুলি প্রদর্শন করবে:

/Users/user/Downloads/hello.c
/Users/user/hello.c

তবে এটি মিলবে না HELLO.Cবা HellO.C। মেলাতে হ'ল কেস সংবেদনশীল -inameকে এই বিকল্পটি পাস করুন :

find $HOME -iname "hello.c" -print

নমুনা আউটপুট:

/Users/user/Downloads/hello.c
/Users/user/Downloads/Y/Hello.C
/Users/user/Downloads/Z/HELLO.c
/Users/user/hello.c

-type fকেবল ফাইল অনুসন্ধানের জন্য বিকল্পটি পাস করুন :

find /dir/to/search -type f -iname "fooBar.conf.sample" -print
find $HOME -type f -iname "fooBar.conf.sample" -print

-inameজিএনইউ বা বিএসডি (ওএস এক্স সহ) সংস্করণটি সন্ধান করে The যদি আপনার কমান্ডের সন্ধানের সংস্করণটি সমর্থন না -inameকরে তবে grepকমান্ডটি ব্যবহার করে নিম্নলিখিত সিনট্যাক্সটি ব্যবহার করে দেখুন :

find $HOME | grep -i "hello.c"
find $HOME -name "*" -print | grep -i "hello.c"

বা চেষ্টা করুন

find $HOME -name '[hH][eE][lL][lL][oO].[cC]' -print

নমুনা আউটপুট:

/Users/user/Downloads/Z/HELLO.C
/Users/user/Downloads/Z/HEllO.c
/Users/user/Downloads/hello.c
/Users/user/hello.c

0

যদি নামের শুরুতে স্ট্রিং হয় তবে আপনি এটি করতে পারেন

$ compgen -f .bash
.bashrc
.bash_profile
.bash_prompt

3
compgenএই পেরেক জন্য উপযুক্ত হাতুড়ি নয়। এই স্বল্প-ব্যবহৃত সরঞ্জামটি উপলভ্য কমান্ডগুলির তালিকা তৈরির জন্য ডিজাইন করা হয়েছে , এবং এর মতো এটি বর্তমান ডিরেক্টরিতে ফাইলগুলি তালিকাভুক্ত করে (যা স্ক্রিপ্ট হতে পারে) এবং এটি ফাইলের নাম বা ফাইলের বিষয়বস্তুর সন্ধান করতে পারে না এবং পুনরায় পুনরুক্তি করতে পারে না বা ফাইল সামগ্রী অনুসন্ধান করে না, এটি তৈরি করে বেশিরভাগই অকেজো
মিশনফোর্ড

0

ইতিমধ্যে সরবরাহিত অনেকগুলি সমাধানের বিকল্প হ'ল গ্লোব ব্যবহার করা **। আপনি যখন ( ) bashবিকল্পটি ব্যবহার করেন বা আপনি ব্যবহার করেন , আপনি কেবল এর জন্য গ্লোব ব্যবহার করতে পারেন ।globstarshopt -s globstarzsh**

**/bar

নামের ফাইলগুলির জন্য একটি পুনরাবৃত্ত ডিরেক্টরি অনুসন্ধান করে bar(সম্ভাব্যভাবে barবর্তমান ডিরেক্টরিতে ফাইল অন্তর্ভুক্ত )। মন্তব্য করুন যে এটি একই পাথ বিভাগে গ্লোব্বিংয়ের অন্যান্য রূপের সাথে একত্রিত করা যায় না; সেক্ষেত্রে,* অপারেটররা তাদের স্বাভাবিক প্রভাবটিতে ফিরে আসে।

নোট করুন যে এখানে zshএবং bashএখানে একটি সূক্ষ্ম পার্থক্য আছে। ডিরেক্টরিগুলিতে bashনরম লিঙ্কগুলি অতিক্রম করবে যখন তা zshকরবে না। এর জন্য আপনাকে গ্লোব ***/ইন ব্যবহার করতে হবে zsh



-2
grep -R "somestring" | cut -d ":" -f 1

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