পাঠ্যের জন্য সমস্ত ফোল্ডার সন্ধান করতে কিভাবে গ্রেপ ব্যবহার করবেন?


0

আমি একবারে সমস্ত ডিরেক্টরি অনুসন্ধান করে সমস্যা নিয়েছি grep। আমি যখন আদেশটি ব্যবহার করি:

find . -name "*.txt" | xargs grep texthere

এটি কেবল চিরকাল লাগে এবং তারপরে আমাকে "এ জাতীয় কোনও ফাইল বা ডিরেক্টরি নেই" ত্রুটি দেয়।

কেন এটি হচ্ছে এবং এর চেয়ে সহজ কিছু নেই grep? নাকি আমি ভুল কমান্ড ব্যবহার করছি?

উত্তর:


1

আপনার যদি জিএনইউ গ্রেপ থাকে তবে গ্রেপ্তার নিজেই @ ওরোবোরাসের পরামর্শ অনুসারে পুনরাবৃত্তভাবে অনুসন্ধানের জন্য "-r" বিকল্পকে সমর্থন করে।

দুর্ভাগ্যক্রমে যদি আপনার গ্রেপ সানোএসের মতো এ জাতীয় বিকল্পটিকে সমর্থন করে না, আপনি পরিবর্তে নিম্নলিখিত আদেশগুলি ব্যবহার করতে পারেন:

find . -name "*.txt" -exec grep -n your_pattern {} /dev/null \;

চতুর হয় /dev/null, grep প্রতিটি মৃত্যুদন্ড নিশ্চিত যোগ করা দুই ফাইলের নামে আছে (ফাইল মিলেছে * .txt ও / dev / নাল) প্রদান করা, এটি মুদ্রণ ফাইলের নাম অনুসন্ধান করা হচ্ছে অত্যাচার। এবং আপনি এর ক্ষেত্রটি পরিমার্জন করার -type fবিকল্প যুক্ত করতে পারেন ।findfind


এটি প্রতিটি ফাইলের জন্য একবার অনুরোধ করার পরে এটি ধীর হবে না grep?
কুসালানন্দ

0

এই উত্তরের হিসাবে , আপনি সম্ভবত এর সাথে আরও ভাল থাকবেন:

grep -rnw '/path/to/somewhere/' -e "pattern"

  • -rবা -Rপুনরাবৃত্ত হয়,
  • -n লাইন নম্বর, এবং
  • -w পুরো শব্দটির সাথে মিলে যায়।
  • -l (লোয়ার-কেস এল) কেবলমাত্র ফাইলের মিলের ফাইলের নাম দিতে যুক্ত করা যেতে পারে।

0

যদি আপনি অনুমতি সম্পর্কে ত্রুটি পেয়ে থাকেন (তবে আপনি বলছেন না যে আপনি করেন) তবে আপনি অনুমান করছেন যে আপনি হয় মূল ডিরেক্টরিতে ( /) বা এমন কোনও পথে দাঁড়িয়ে আছেন যেখানে আপনার কাছে সমস্ত ফাইল পড়ার অনুমতি নেই, হিসেবে যেমন /etcঅথবা /var। তবে আপনি যেহেতু বলছেন এটি একটি অত্যন্ত দীর্ঘ সময় নেয় তাই আমি প্রথম অনুমানের (মূল ডিরেক্টরি) দিকে আরও ঝুঁকছি।

আপনি যদি পুরো সিস্টেমে একেবারে সমস্ত ফাইল অনুসন্ধান করতে চান তবে আপনি যা করছেন তা বেশ সঠিক। এটা তোলে করবে একটি দীর্ঘ সময় কোন ব্যাপার আপনি কি করবেন নিতে। এটি অনুসন্ধানের জন্য কেবলমাত্র একটি ভয়ঙ্কর ফাইল।

আপনি দেখতে findফাইলের পরিমাণ সঙ্কুচিত করতে ব্যবহার করতে পারেন ।

এই মুহূর্তে, আপনার আছে

$ find . -name "*.txt" | xargs grep texthere

যেহেতু দেখে মনে হচ্ছে আপনি কেবল প্লেইন পাঠ্য ফাইলগুলিতে আগ্রহী তাই আমরা অন্য কোনও ধরণের ফাইল (এক্সিকিউটেবল) বাদ দিতে পারি:

$ find / -type f \! -perm -o=x -name "*.txt" | xargs grep texthere

আমি প্রতিস্থাপিত .সঙ্গে /, এখানে যে কারণ আমি কোথায় মনে হয় (আমি হলে শুধরে আমি ভুল)। আমি আরও উল্লেখ করছি যে আমি ফাইলগুলি ( -type f) যা এক্সিকিউটেবল ( \! -perm -o=x) ( !আপনার শেল এটির সাথে মজার কাজ না করে) এড়াতে হবে want

এখন, আমরা আরও কিছু কাজ করতে পারি। একটি হ'ল একটি সুরক্ষার জিনিস এবং অন্যটি সম্ভবত গতিকে সামান্য কিছুটা উন্নত করতে পারে

কিছু ফাইলের নামগুলিতে শূন্যস্থান থাকতে পারে, বা অন্যান্য জঞ্জাল চরিত্র যা আমরা সাধারণত ফাইলের নামগুলিতে চাই না। এগুলি যথাযথভাবে পাস করতে সক্ষম হওয়ার জন্য findএবং grepআমরা করি

$ find / -type f \! -perm -o=x -name "*.txt" -print0 | xargs -0 grep texthere

এর ( -print0) অর্থ প্রতিটি ফাইলের নাম স্পেস অক্ষরের পরিবর্তে একটি nulঅক্ষর ( \0) দ্বারা সীমাবদ্ধ করা হবে । এবং xargsএই হিসাবে- nulসীমাবদ্ধ ফাইলের নামগুলি প্রাপ্ত করার জন্য সম্পর্কিত বিকল্পটি হ'ল -0

কারণ আপনি সেই দুটি বিকল্প ব্যবহার করছেন না বলে আমার বিশ্বাস আপনি এই "কোনও ফাইল বা ডিরেক্টরি নেই" ত্রুটি পেয়েছেন।

গতি জিনিস fgrep। এটি এমন একটি ইউটিলিটি যা grep -Fআপনার সন্ধানের স্ট্রিংটিতে কোনও নিয়মিত এক্সপ্রেশন না থাকলে কোনও সরল পাঠ্য স্ট্রিং হলে আপনার ব্যবহার করা উচিত এর ঠিক সমান ।

সুতরাং, আপনার যদি একটি সরল পাঠ্য স্ট্রিং থাকে এবং আপনি এটি পুরো সিস্টেমের প্রতিটি ফাইলে সন্ধান করতে চান:

$ find / -type f \! -perm -o=x -name "*.txt" -print0 | xargs -0 fgrep texthere

অনুমতি জিনিস ... অবশ্যই এমন ফাইল থাকবে যা আপনি পড়তে পারবেন না। আপনি হয় চালাতে পারেন findএবং তাদের কাছে চালিত fgrepরেখে sudo:

$ sudo find ... | xargs -0 sudo fgrep texthere

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

অথবা আপনি কেবল sudo -sএকটি রুট শেল পেতে এবং সেখান থেকে জিনিসটি চালাতে পারবেন ... তবে আমি সাধারণত এর বিরুদ্ধে পরামর্শ দেব কারণ লোকেরা তাদের সিস্টেমগুলি ভুলে গিয়ে তাদের গণ্ডগোল করার প্রবণতা রয়েছে root

অন্য কোনও সমাধান হ'ল পুরো সিস্টেমের locateসমস্ত .txtফাইল সনাক্ত করতে কমান্ডটি ব্যবহার করা । locateকমান্ড ফাইল অনুক্রমের অনুসন্ধান করে না কিন্তু এর পরিবর্তে একটি ডাটাবেস (সাধারণত প্রতিদিন আপডেট করা হয় যা, তাই ব্যবহার সব ফাইল হতে পারে)। ডাটাবেসটিতে সমস্ত ব্যবহারকারীদের দ্বারা অ্যাক্সেসযোগ্য ডিরেক্টরিগুলিতে ফাইল থাকে না, সুতরাং আপনি যদি নিজের ডিরেক্টরিতে পঠন-অনুমতিগুলি সরিয়ে ফেলে থাকেন তবে আপনার ফাইলগুলি সেখানে থাকবে না।

সুতরাং, findউপরের কমান্ডটি locateপ্রায় সমমানের সাথে প্রতিস্থাপন করুন :

$ locate '*.txt' -0 | xargs -0 fgrep texthere

-0বিকল্প (অথবা --nullকিছু সিস্টেমে দিকে) অনুরূপ --print0বিকল্প find

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