উত্তর:
বিদ্যমান উত্তরগুলি সম্পূর্ণ করতে:
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
নিজেই ওয়াইল্ডকার্ড সমর্থন করে।
ls
কোনও ডিরেক্টরি তালিকা তৈরি করতে বলেন , এটি এটি খোলে, এটি করার মতোই ls -l BirthdayPhotos
। আপনি সেই আচরণটি দমন করতে পারেন ls -d B*
।
B*
একটি ডিরেক্টরি নির্দিষ্টকরণ হিসাবে বিবেচনা করে ?
B*
শুরু হয় সেই সমস্ত ডিরেক্টরিগুলির সাথে মেলে যা প্রসারিত হয় B
তাই আপনি সত্যিই ls
ডিরেক্টরিগুলির একটি তালিকা পাস করছেন , সুতরাং এটি আপনার জন্য সেগুলি সব খুলে দেয়।
ls -d ABC*
লেখক যা জিজ্ঞাসা করেছিলেন তা ছিল। কোড স্নিপেটে মন্তব্যগুলিও ভুল, এবিসি দিয়ে শুরু ডিরেক্টরিগুলির বিষয়বস্তুls abc*
তালিকাভুক্ত করে ।
find
প্যাটার্ন সহ ফাইলগুলি অনুসন্ধান করতে আপনি আদেশটি ব্যবহার করতে পারেন
find . -type f -name "abc*"
উপরের কমান্ডটি বর্তমান ওয়ার্কিং ডিরেক্টরিের অধীনে abc দিয়ে শুরু হওয়া ফাইলটি অনুসন্ধান করবে।
-name 'abc'
হুবহু মিলে যাওয়া ফাইলগুলি তালিকাভুক্ত করবে। যেমন: এবিসি
আপনি ব্যবহার করতে পারেন
-iname
-regex
find
একটি প্যাটার্ন ব্যবহার করে ফাইলের নাম অনুসন্ধান করতে কমান্ড সহ বিকল্প
আপনি তাদের সাথে ঠিক কী করতে চান তার উপর নির্ভর করে এটি করার অনেকগুলি উপায় রয়েছে। সাধারণত, আপনি যদি কেবল তাদের তালিকাবদ্ধ করতে চান তবে আপনি এটি ব্যবহার করে টার্মিনালে এটি করতে পারেন:
find | grep '^\./ABC'
... এবং ABC
আপনার পাঠ্যের সাথে প্রতিস্থাপন করা হচ্ছে।
কমান্ডটি বুঝতে, আসুন এটি কিছুটা ভেঙে দিন:
find
বর্তমান ডিরেক্টরি এবং এর উপ-ডিরেক্টরিতে সমস্ত ফাইল তালিকাভুক্ত করে; এটি একা ব্যবহার করে সেখানে সমস্ত কিছু তালিকাভুক্ত করা হবে। নোট করুন যে find
প্রতিটি ফাইল বা ডিরেক্টরি দিয়ে শুরু করে আউটপুট ./
, এটি নির্দেশ করে যে তাদের পাথ বর্তমান ডিরেক্টরিটির সাথে সম্পর্কিত। এই সচেতন হচ্ছে গুরুত্বপূর্ণ কারণ এটি মানে আমরা দিয়ে শুরু ফলাফল অনুসন্ধান করবে ./ABC
এবং মাত্র ABC
।
পাইপ অক্ষরটি |
একটি কমান্ডের আউটপুটটিকে অন্য কমান্ডে পুনঃনির্দেশ করে, এক্ষেত্রে আউটপুটটিকে find
পুনঃনির্দেশিত করা হয় grep
। একে পাইপিং বলা হয়।
grep
আউটপুট নেয় এবং প্রদত্ত প্যাটার্ন ব্যবহার করে এটি ফিল্টার করে ^\./ABC
।
' '
শেলটির অভ্যন্তরে বিশেষ অক্ষরগুলি ব্যাখ্যা করতে বাধা দেওয়ার জন্য প্যাটার্নটি একক উদ্ধৃতি দিয়ে উদ্ধৃত করা হয়েছে ।এখন প্যাটার্নটি নিজেই একটি নির্দিষ্ট সিনট্যাক্সে রচিত হয় যাকে নিয়মিত অভিব্যক্তি বলা হয় বা সংক্ষেপে রেজেেক্স । Regex একটি অত্যন্ত শক্তিশালী অনুসন্ধানের টুল আপনি এটা মাস্টার, এবং যেমন সাইটগুলি হয় এই যা আরো গভীরতার মধ্যে এটি সম্পর্কে আপনি শেখানো, কিন্তু লক্ষ্য করুন যে grep
একটি পূর্ণাঙ্গ Regex ইঞ্জিন নয় এবং আপনি এটি দিয়ে সবকিছু করতে পারবেন না।
আমাদের উদ্দেশ্যে:
^
রেজেক্সে স্ট্রিংয়ের শুরুর সাথে মেলে; এটি যদি ফাইল নামের শুরুতে না ঘটে তবে প্যাটার্নটি মেলাতে বাধা দেয়।
.
ইন রেজেক্সের একটি বিশেষ অর্থও রয়েছে: এর অর্থ "এখানে কোনও একক চরিত্রের সাথে মিল"। আপনি যদি এটি আক্ষরিক বিন্দু হিসাবে ব্যবহার করতে চান তবে আপনাকে এটির \
আগে একটি ব্যাকস্ল্যাশ ব্যবহার করে "পালাতে" হবে। (হ্যাঁ, যে কোনও চরিত্রের সাথে মিল পাওয়া আমাদের পক্ষে নিরীহ হতে পারে তবে আমি এটি সম্পূর্ণতার জন্যই করেছি did)
find | grep
যখন find
তার নিজস্ব পুরোপুরি ভাল প্যাটার্ন-তুল্য ক্ষমতা আছে?
আপনি জিআরইপি ব্যবহার করতে পারেন, আমি মনে করি এটি সবচেয়ে সহজ সমাধান, সম্ভবত ম্যাচটি আরও নির্ভুল করতে আরও কিছু গ্রেপ পরামিতি যুক্ত করুন
tree | grep ABC
নটিলাস ফাইল ম্যানেজার এবং নিয়মিত এক্সপ্রেশন ব্যবহার করে আপনি কোনও নির্দিষ্ট প্যাটার্নটি অনুসন্ধান করতে পারেন।
এটি করতে নীচের মত গিয়ার মেনুতে সিলেক্ট আইটেমস ম্যাচিংয়ে ক্লিক করুন (আপনি Ctrl+ টিপতেও পারেন s)।
তারপরে, কেবল নিয়মিত প্রকাশটি টাইপ করুন ABC*
এবং বৈধতা দিন।
যার নামটি আপনার প্যাটার্নের সাথে মেলে প্রতিটি ফাইল স্বয়ংক্রিয়ভাবে নির্বাচিত হবে।
আমি উবুন্টু 12.10 (কোয়ান্টাল) এর জিনোম 3 পিপিএ থেকে নটিলাস 3.6 ব্যবহার করছি ।
আমার সবচেয়ে সহজ সমাধান
ls | grep PATTERN
এখানে আপনি PATTERN এ যেকোন নিয়মিত প্রকাশ করতে পারেন।
উদাহরণস্বরূপ, এর নামের মধ্যে যে কোনও জায়গায় "আব" দিয়ে ফাইলগুলি সন্ধান করতে টাইপ করুন
ls | grep ".*ab.*"
"Ab" দিয়ে শুরু হওয়া ফাইলগুলি সন্ধান করতে টাইপ করুন
ls | grep "^ab"
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
নোট:
find
শুরু হওয়া কমান্ডটি একটি দীর্ঘ সময় এবং বহু অনুমতি ত্রুটি তৈরি /
করবে ।sudo updatedb
প্রথমে চালানো উচিত ।আমি ব্যবহার করি
ls | grep abc
অথবা
ls -la | grep abc
এটি সমস্ত ফাইলগুলিকে এবিসি দিয়ে দেখায়, কেবল এপিসি দিয়ে শুরু হয় না। তবে, এটি করার জন্য এটি আমার পক্ষে একটি খুব সহজ উপায়।
পাইথন:
$ python -c 'import sys,os;found=[os.path.join(r,i) for r,s,f in os.walk(".") for i in f if i.startswith("ABC")];map(lambda x: sys.stdout.write(x+"\n") ,found)'
পার্ল:
$ perl -le 'use File::Find;find(sub{ -f && $_ =~/^ABC/ && print $File::Find::name },".")'
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
আমার প্রিয় ভিআইএম প্লাগইনগুলির একটিতে কমান্ড-টি , এটি এফজেডএফের সাথে একীকরণের উপরে রুবি ভিত্তিক প্লাগইন ।
কোমেন্ড-টি এবং এফজেডএফ ব্যবহার করে আপনি অত্যন্ত দ্রুত "ফাজি" প্রক্রিয়াটির সাথে অনুসন্ধানটি করতে পারেন:
যেমন আপনি দেখতে পারেন
আমি সর্বদা একটি নতুন টার্মিনাল খোলার মাধ্যমে কমান্ডের ইতিহাস অনুসন্ধান করি এবং হিট:
CTRL+R
যেকোন টার্মিনাল ট্যাবে লিখে পুনরাবৃত্তভাবে সমস্ত ফোল্ডারে অনুসন্ধান করা:
fzf
তারপরে আপনার ফাইলের নাম শুরু করুন
ABC
এছাড়াও, আপনি ভিতরে লিখতে পারেন vim
:CommandT
বিশেষত বড় ফোল্ডারে সত্যিই সহায়ক।
ধরে নিন যে আমি মূল ডিরেক্টরিতে আছি এবং আমি কেবলমাত্র ডিরেক্টরি ডিরেক্টরিগুলির তালিকা চাই: আমরা লিখি,
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
ls -l B*
এটি করি তবে কেন এটি সমস্ত ডিরেক্টরি সামগ্রীর তালিকাB
মিলে যাওয়া ডিরেক্টরিগুলির পরিবর্তে শুরু হয় ?