ডিরেক্টরিতে "এবিসি" নাম দিয়ে শুরু হওয়া সমস্ত ফাইল কীভাবে অনুসন্ধান করবেন?


58

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

উত্তর:


60

বিদ্যমান উত্তরগুলি সম্পূর্ণ করতে:

ls

ডিফল্ট ডিরেক্টরি তালিকা ইউটিলিটি lsশেলের ওয়াইল্ডকার্ডের সাথে একত্রে ব্যবহৃত হতে পারে। প্যাটার্ন সহ সমস্ত ফাইল অনুসন্ধান করতে abc:

ls abc*   # list all files starting with abc---
ls *abc*  # list all files containing --abc--
ls *abc   # list all files ending with --abc

নোট করুন যে ফাইল এক্সটেনশন অনুসন্ধান ফলাফলের জন্যও প্রাসঙ্গিক।


tree

যদি আমাদের ডিরেক্টরি ট্রিতে ফাইলগুলি তালিকাবদ্ধ করতে হয় তবে আমরা treeপ্রদত্ত প্যাটার্নটি অনুসন্ধান করতে ইস্যু করতে পারি যেমন:

tree -P 'abc*'  # list directory tree of file starting with abc---
tree -l 'def*'  # exclude files starting with def---

এই ক্ষেত্রে, treeনিজেই ওয়াইল্ডকার্ড সমর্থন করে।


2
আমি যখন ls -l B*এটি করি তবে কেন এটি সমস্ত ডিরেক্টরি সামগ্রীর তালিকা Bমিলে যাওয়া ডিরেক্টরিগুলির পরিবর্তে শুরু হয় ?
এরিক 23

@ এরিক কারণ আপনি যখন lsকোনও ডিরেক্টরি তালিকা তৈরি করতে বলেন , এটি এটি খোলে, এটি করার মতোই ls -l BirthdayPhotos। আপনি সেই আচরণটি দমন করতে পারেন ls -d B*
আজোর অহাই

@ আজোরআহাই তবে এটি কেন B*একটি ডিরেক্টরি নির্দিষ্টকরণ হিসাবে বিবেচনা করে ?
এরিক

@ এরিক কারণ যে ফাইলটি গ্লোব ব্যবহার করে B*শুরু হয় সেই সমস্ত ডিরেক্টরিগুলির সাথে মেলে যা প্রসারিত হয় Bতাই আপনি সত্যিই lsডিরেক্টরিগুলির একটি তালিকা পাস করছেন , সুতরাং এটি আপনার জন্য সেগুলি সব খুলে দেয়।
আজোর অহাই

1
প্রশ্নের উত্তর দেয় না। ls -d ABC*লেখক যা জিজ্ঞাসা করেছিলেন তা ছিল। কোড স্নিপেটে মন্তব্যগুলিও ভুল, এবিসি দিয়ে শুরু ডিরেক্টরিগুলির বিষয়বস্তুls abc* তালিকাভুক্ত করে ।
গ্রেটভোভান

42

findপ্যাটার্ন সহ ফাইলগুলি অনুসন্ধান করতে আপনি আদেশটি ব্যবহার করতে পারেন

find . -type f -name "abc*" 

উপরের কমান্ডটি বর্তমান ওয়ার্কিং ডিরেক্টরিের অধীনে abc দিয়ে শুরু হওয়া ফাইলটি অনুসন্ধান করবে।

-name 'abc'হুবহু মিলে যাওয়া ফাইলগুলি তালিকাভুক্ত করবে। যেমন: এবিসি

আপনি ব্যবহার করতে পারেন

 -iname
 -regex 

findএকটি প্যাটার্ন ব্যবহার করে ফাইলের নাম অনুসন্ধান করতে কমান্ড সহ বিকল্প


7

আপনি তাদের সাথে ঠিক কী করতে চান তার উপর নির্ভর করে এটি করার অনেকগুলি উপায় রয়েছে। সাধারণত, আপনি যদি কেবল তাদের তালিকাবদ্ধ করতে চান তবে আপনি এটি ব্যবহার করে টার্মিনালে এটি করতে পারেন:

find | grep '^\./ABC'

... এবং ABCআপনার পাঠ্যের সাথে প্রতিস্থাপন করা হচ্ছে।

কমান্ডটি বুঝতে, আসুন এটি কিছুটা ভেঙে দিন:

  • findবর্তমান ডিরেক্টরি এবং এর উপ-ডিরেক্টরিতে সমস্ত ফাইল তালিকাভুক্ত করে; এটি একা ব্যবহার করে সেখানে সমস্ত কিছু তালিকাভুক্ত করা হবে। নোট করুন যে findপ্রতিটি ফাইল বা ডিরেক্টরি দিয়ে শুরু করে আউটপুট ./, এটি নির্দেশ করে যে তাদের পাথ বর্তমান ডিরেক্টরিটির সাথে সম্পর্কিত। এই সচেতন হচ্ছে গুরুত্বপূর্ণ কারণ এটি মানে আমরা দিয়ে শুরু ফলাফল অনুসন্ধান করবে ./ABCএবং মাত্র ABC

  • পাইপ অক্ষরটি |একটি কমান্ডের আউটপুটটিকে অন্য কমান্ডে পুনঃনির্দেশ করে, এক্ষেত্রে আউটপুটটিকে findপুনঃনির্দেশিত করা হয় grep। একে পাইপিং বলা হয়।

  • grepআউটপুট নেয় এবং প্রদত্ত প্যাটার্ন ব্যবহার করে এটি ফিল্টার করে ^\./ABC

    • লক্ষ্য করুন যে ' 'শেলটির অভ্যন্তরে বিশেষ অক্ষরগুলি ব্যাখ্যা করতে বাধা দেওয়ার জন্য প্যাটার্নটি একক উদ্ধৃতি দিয়ে উদ্ধৃত করা হয়েছে ।
  • এখন প্যাটার্নটি নিজেই একটি নির্দিষ্ট সিনট্যাক্সে রচিত হয় যাকে নিয়মিত অভিব্যক্তি বলা হয় বা সংক্ষেপে রেজেেক্স । Regex একটি অত্যন্ত শক্তিশালী অনুসন্ধানের টুল আপনি এটা মাস্টার, এবং যেমন সাইটগুলি হয় এই যা আরো গভীরতার মধ্যে এটি সম্পর্কে আপনি শেখানো, কিন্তু লক্ষ্য করুন যে grepএকটি পূর্ণাঙ্গ Regex ইঞ্জিন নয় এবং আপনি এটি দিয়ে সবকিছু করতে পারবেন না।

  • আমাদের উদ্দেশ্যে:

    • ^রেজেক্সে স্ট্রিংয়ের শুরুর সাথে মেলে; এটি যদি ফাইল নামের শুরুতে না ঘটে তবে প্যাটার্নটি মেলাতে বাধা দেয়।

    • .ইন রেজেক্সের একটি বিশেষ অর্থও রয়েছে: এর অর্থ "এখানে কোনও একক চরিত্রের সাথে মিল"। আপনি যদি এটি আক্ষরিক বিন্দু হিসাবে ব্যবহার করতে চান তবে আপনাকে এটির \আগে একটি ব্যাকস্ল্যাশ ব্যবহার করে "পালাতে" হবে। (হ্যাঁ, যে কোনও চরিত্রের সাথে মিল পাওয়া আমাদের পক্ষে নিরীহ হতে পারে তবে আমি এটি সম্পূর্ণতার জন্যই করেছি did)


1
কেন তুমি হবে find | grepযখন findতার নিজস্ব পুরোপুরি ভাল প্যাটার্ন-তুল্য ক্ষমতা আছে?
দারেল

3

আপনি জিআরইপি ব্যবহার করতে পারেন, আমি মনে করি এটি সবচেয়ে সহজ সমাধান, সম্ভবত ম্যাচটি আরও নির্ভুল করতে আরও কিছু গ্রেপ পরামিতি যুক্ত করুন

tree | grep ABC

2

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

এটি করতে নীচের মত গিয়ার মেনুতে সিলেক্ট আইটেমস ম্যাচিংয়ে ক্লিক করুন (আপনি Ctrl+ টিপতেও পারেন s)।

এখানে চিত্র বর্ণনা লিখুন

তারপরে, কেবল নিয়মিত প্রকাশটি টাইপ করুন ABC*এবং বৈধতা দিন।

এখানে চিত্র বর্ণনা লিখুন

যার নামটি আপনার প্যাটার্নের সাথে মেলে প্রতিটি ফাইল স্বয়ংক্রিয়ভাবে নির্বাচিত হবে।

এখানে চিত্র বর্ণনা লিখুন

আমি উবুন্টু 12.10 (কোয়ান্টাল) এর জিনোম 3 পিপিএ থেকে নটিলাস 3.6 ব্যবহার করছি ।


1

আমার সবচেয়ে সহজ সমাধান

ls | grep PATTERN

এখানে আপনি PATTERN এ যেকোন নিয়মিত প্রকাশ করতে পারেন।

উদাহরণস্বরূপ, এর নামের মধ্যে যে কোনও জায়গায় "আব" দিয়ে ফাইলগুলি সন্ধান করতে টাইপ করুন

ls | grep ".*ab.*"

"Ab" দিয়ে শুরু হওয়া ফাইলগুলি সন্ধান করতে টাইপ করুন

ls | grep "^ab"

1

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

$ locate /ABC
/mnt/clone/home/rick/.cache/mozilla/firefox/9fu0cuql.default/cache2/entries/ABC6AD2FEC16465049B48D39FD2FE538258F2A34
/mnt/clone/home/rick/.cache/mozilla/firefox/9fu0cuql.default/cache2/entries/ABCBFDA54262F47253F95ED6ED4131A465EE0E39
/mnt/clone/usr/src/linux-headers-5.0.1-050001/tools/lib/lockdep/tests/ABCABC.sh
/mnt/clone/usr/src/linux-headers-5.0.1-050001/tools/lib/lockdep/tests/ABCDBCDA.sh
/mnt/clone/usr/src/linux-headers-5.0.1-050001/tools/lib/lockdep/tests/ABCDBDDA.sh
/mnt/old/home/rick/.cache/mozilla/firefox/3vkvi6ov.default/cache2/entries/ABC0C99FCEABAD0C6AA2078CD025A1CDE48D7BA1
/usr/src/linux-headers-5.0.1-050001/tools/lib/lockdep/tests/ABCABC.sh
/usr/src/linux-headers-5.0.1-050001/tools/lib/lockdep/tests/ABCDBCDA.sh
/usr/src/linux-headers-5.0.1-050001/tools/lib/lockdep/tests/ABCDBDDA.sh

নোট:

  • উপরের কমান্ডটি 1 মিলিয়ন ফাইলগুলিতে চালাতে 1 সেকেন্ড সময় নেয়।
  • তুলনায় রুট ডিরেক্টরিতে findশুরু হওয়া কমান্ডটি একটি দীর্ঘ সময় এবং বহু অনুমতি ত্রুটি তৈরি /করবে ।
  • যদি ফাইলগুলি আজ তৈরি করা হত তবে আপনাকে অবশ্যই sudo updatedbপ্রথমে চালানো উচিত ।

0

আমি ব্যবহার করি

ls | grep abc

অথবা

ls -la | grep abc

এটি সমস্ত ফাইলগুলিকে এবিসি দিয়ে দেখায়, কেবল এপিসি দিয়ে শুরু হয় না। তবে, এটি করার জন্য এটি আমার পক্ষে একটি খুব সহজ উপায়।



0
printf "%s" /path/to/files/ABC*

এটি গ্লোব প্যাটার্ন মিলছে যা উভয় প্রান্তে নোঙ্গর করা আছে। এটি "ABC", "ABC", "ABC.txt", "ABC123" এর মতো শুরু হওয়া ফাইলগুলির সমস্ত উপস্থিতির সাথে মিলবে তবে "xABC" নয়। কমান্ড লাইন থেকে এখানে 'প্রিন্টফ' এর জায়গায় 'এলএস' ব্যবহার করা একটি নিরাপদ বিকল্প, তবে আপনি কার মতামতের সাথে একমত হয়ে থাকেন, 'এলএস' কোনও স্ক্রিপ্টে ব্যবহারের জন্য নিরাপদ নয়। সেক্ষেত্রে গ্লোব প্যাটার্ন মিলের সাথে 'প্রিন্টফ' ব্যবহার করা নিরাপদ হিসাবে বিবেচিত হয়। আপনি যদি স্ক্রিপ্টে এটি ব্যবহার করতে যান তবে 'প্রিন্টফ' এর আউটপুটটিতে আউটপুট স্ট্রিমের শেষ হওয়া পর্যন্ত কোনও নতুন লাইন অক্ষর থাকবে না:

printf "%s" /path/to/files/ABC*  

রিটার্নস:

/path/to/files/ABC /path/to/files/ABC123

আপনার যদি প্রতিটি উদাহরণের পরে লাইন ব্রেক প্রয়োজন হয়:

printf "%s\n" /path/to/files/ABC*

রিটার্নস:

/path/to/files/ABC 

/path/to/files/ABC123

"/ पथ / টু / ফাইল /" আউটপুট থেকে যায় যদি আপনি 'প্রিন্টফ' কমান্ডটি চালাচ্ছিলেন তখন আপনি যদি সেভাবে প্রবেশ করে থাকেন। এটি ছাড়া কেবল ফাইলের নাম উপস্থিত হয়:

printf "%s" ABC* 

রিটার্নস

ABC ABC123

ধরে নিচ্ছি আপনি যে ডিরেক্টরিতে ফাইল বিদ্যমান সেখানে কমান্ডটি চালাচ্ছেন।


echo /path/to/files/ABC* | tr " " "\n"একটি ভাল ধারণা নয়। ফাইল আছে কিনা তা বিবেচনা করুন /path/to/files/ABC EFG, ফাইলের নামের মধ্যে একটি জায়গা আছে। আপনার trফাইলের নাম দুটি পৃথক লাইনে বিভক্ত হবে, যা ভাল নয়। আরও বেশি খারাপ যদি ফাইলের নামে একাধিক স্পেস থাকে। আমি এর printf "%s\n" ABC*পরিবর্তে আপনার ব্যবহারের পরামর্শ দিই যা ফাইলের নামগুলির মধ্যে ফাঁকা স্থানগুলির সাথে সহায়তা করে তবে অন্য বিশেষ চরিত্রগুলির মতো এখনও সমস্যাযুক্ত\n
সের্গি কলডিয়াজহনি

0

আমার প্রিয় ভিআইএম প্লাগইনগুলির একটিতে কমান্ড-টি , এটি এফজেডএফের সাথে একীকরণের উপরে রুবি ভিত্তিক প্লাগইন

কোমেন্ড-টি এবং এফজেডএফ ব্যবহার করে আপনি অত্যন্ত দ্রুত "ফাজি" প্রক্রিয়াটির সাথে অনুসন্ধানটি করতে পারেন:

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

যেমন আপনি দেখতে পারেন

এখানে চিত্র বর্ণনা লিখুন

আমি সর্বদা একটি নতুন টার্মিনাল খোলার মাধ্যমে কমান্ডের ইতিহাস অনুসন্ধান করি এবং হিট:

CTRL+R

যেকোন টার্মিনাল ট্যাবে লিখে পুনরাবৃত্তভাবে সমস্ত ফোল্ডারে অনুসন্ধান করা:

fzf

তারপরে আপনার ফাইলের নাম শুরু করুন

ABC

এছাড়াও, আপনি ভিতরে লিখতে পারেন vim

:CommandT 

বিশেষত বড় ফোল্ডারে সত্যিই সহায়ক।


0

ধরে নিন যে আমি মূল ডিরেক্টরিতে আছি এবং আমি কেবলমাত্র ডিরেক্টরি ডিরেক্টরিগুলির তালিকা চাই: আমরা লিখি,

find -type d -name "etc"

ফল আমরা পেয়েছি,

[root@unix /]# find -type d -name "etc"

./etc
./usr/lib/firefox/bundled/etc
./usr/lib/unix-yarn/etc
./usr/lib/unix/etc
./usr/lib/festival/etc
./usr/bin/lib/vmware-tools/lib64/libconf/etc
./usr/bin/lib/vmware-tools/lib32/libconf/etc
./usr/etc
./usr/share/doc/oddjob-0.30/sample/etc
./usr/share/festival/lib/etc
./usr/local/etc
./usr/java/jdk1.7.0_25/lib/visualvm/etc
./home/user1/Desktop/VMware Tools/vmware-tools-distrib/lib/lib64/libconf/etc
./home/user1/Desktop/VMware Tools/vmware-tools-distrib/lib/lib32/libconf/etc
./home/user1/Desktop/VMware Tools/vmware-tools-distrib/etc
./home/user1/Desktop/VMware Tools/vmware-tools-distrib/caf/etc

আরেকটি উদাহরণ,

এছাড়াও আমরা লিখতে পারি:

ls | grep "etc"

আমরা পেতে,

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