কোনও ওয়াইল্ডকার্ড-এম্বেড থাকা "সন্ধান" অনুসন্ধানে লুকানো ফাইল এবং ডিরেক্টরিগুলি কীভাবে বাদ / উপেক্ষা করবেন?


119

থেকে শুরু ( "কিছু পাঠ্য" এর আগে এবং পরে ওয়াইল্ডকার্ডগুলি লক্ষ্য করুন )

find . -type f -name '*some text*'

কীভাবে কেউ সমস্ত লুকানো ফাইল এবং ডিরেক্টরিগুলি বাদ / উপেক্ষা করতে পারে?

আমি ইতিমধ্যে খুব দীর্ঘ জন্য googling ছিল , কিছু প্রাইস জুড়ে এসেছি এবং! (বিস্ময়কর চিহ্ন) প্যারামিটারগুলি, তবে কোনও কাজ করার উপযুক্ত (এবং পার্সোনামিয়াস) উদাহরণ নেই যা সবেমাত্র কাজ করেছে

বংশীধ্বনিতুল্য | করার grepএকটি বিকল্প হতে হবে এবং আমিও যে উদাহরণ স্বাগত জানাই চাই; কিন্তু প্রাথমিকভাবে আমি একটি সংক্ষিপ্ত এক-লাইনের (অথবা অনুষঙ্গহীন এক liners, একটি দম্পতি, একই কম্যান্ড-লাইন লক্ষ্য অর্জনের বিভিন্ন উপায়ে ব্যাখ্যা) আগ্রহী মাত্র ব্যবহার find

পিএস: লিনাক্সে ফাইলগুলি সন্ধান করুন এবং সুনির্দিষ্ট ডিরেক্টরিগুলি বর্জন করে যা ঘনিষ্ঠভাবে সম্পর্কিত বলে মনে হয় তবে ক) এখনও স্বীকৃত হয়নি এবং খ) সম্পর্কিত-তবে-ভিন্ন-এবং স্বতন্ত্র, তবে গ) বিভ্রান্তি চিহ্নিত করতে সহায়তা করতে পারে!

সম্পাদন করা

find . \( ! -regex '.*/\..*' \) -type f -name "whatever", কাজ করে। রেজেক্স "কোনও কিছুর, তারপরে একটি স্ল্যাশ, তারপরে একটি বিন্দু, তারপরে কিছু" (যেমন তাদের সাবফোল্ডারগুলি সহ সমস্ত লুকানো ফাইল এবং ফোল্ডার) এবং "" অনুসন্ধান করে! রেজেক্স অবহেলা।


আপনি আপনার সম্পাদনায় যা চেয়েছিলেন তাতে সহায়তা করে না তবে আমার প্রশ্ন এবং এর উত্তরটি এখানে দেখুন: unix.stackexchange.com/q/69164/15760 এবং উত্তরের লিঙ্কটি।

উত্তর:


134

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

find . -not -path '*/\.*'

সুতরাং যদি আপনি some textএর নামে কোনও ফাইল সন্ধান করেন , এবং আপনি লুকানো ফাইল এবং ডিরেক্টরিগুলি এড়িয়ে যেতে চান, রান করুন:

find . -not -path '*/\.*' -type f -name '*some text*'

ব্যাখ্যা:

-pathবিকল্প চেক সমগ্র পথ স্ট্রিং বিরুদ্ধে একটি প্যাটার্ন চালায়। *একটি ওয়াইল্ডকার্ড, /ডিরেক্টরি বিভাজক, \.একটি ডট (বিশেষ অর্থ এড়াতে এড়াতে হবে), এবং *অন্য একটি ওয়াইল্ডকার্ড। -notমানে এই পরীক্ষার সাথে মেলে এমন ফাইলগুলি নির্বাচন করবেন না।

আমি মনে করি না যে findএটি পূর্ববর্তী কমান্ডে লুকিয়ে থাকা ডিরেক্টরিগুলি পুনরাবৃত্তভাবে অনুসন্ধান করা এড়াতে যথেষ্ট স্মার্ট, সুতরাং আপনার যদি গতির প্রয়োজন হয় তবে তার -pruneপরিবর্তে এই জাতীয় ব্যবহার করুন:

 find . -type d -path '*/\.*' -prune -o -not -name '.*' -type f -name '*some text*' -print

আপনার শেষটির সাথে নোট করুন যেটি আপনার -printশেষদিকে দরকার! এছাড়াও, নিশ্চিত না -name '\.*' would be more efficient instead of -পাথ (কারণ পথটি সাবপাথগুলি অনুসন্ধান করছে, তবে এগুলি ছাঁটাই করা হবে)
আর্টফুলবোট

.এই প্রসঙ্গে বিশেষ অর্থ কী ?
frostschutz

@frostschutz ডট-এর পরে findবর্তমান ডিরেক্টরি: বর্তমান ডিরেক্টরিতে findসমস্ত ফাইল এবং ডিরেক্টরি দেখবে। যুক্তিটি pathএকটি নিয়মিত অভিব্যক্তি, যেখানে বিন্দুটির অর্থ সাধারণত কোনও "অক্ষর" বোঝানো হয়, এর অর্থ এটি একটি আক্ষরিক বিন্দুকে বোঝায় যে এটি ব্যাকস্ল্যাশ দিয়ে এড়াতে হবে। যুক্তি পর -name নয় একটি রেগুলার এক্সপ্রেশন, কিন্তু এটা মত ওয়াইল্ডকার্ড বিস্তৃতি ?এবং *একটি শেল মত।
ফ্লাইমে

2
@ ফ্রস্টসচুটজ আসলে, এটি ভাবতে আসুন, আমি .বিশেষ অর্থ হওয়া সম্পর্কে ভুল হতে পারি ।
Flimm

1
@ ফ্লিম ইয়ুপ, পালানোর দরকার নেই .। যতদূর আমি সচেতন আছি, শুধুমাত্র এই পলান করা প্রয়োজন: *, ?, এবং []
thdoan

10

বিএসডি, ম্যাক এবং লিনাক্সে সঠিকভাবে কাজ করে এমন ডট-ফাইল বাদ দেওয়ার কয়েকটি মাধ্যমের মধ্যে এটি একটি:

find "$PWD" -name ".*" -prune -o -print
  • $PWD বর্তমান ডিরেক্টরিতে পুরো পাথটি মুদ্রণ করুন যাতে পথটি শুরু না হয় ./
  • -name ".*" -prune কোনও বিন্দু দিয়ে শুরু হওয়া কোনও ফাইল বা ডিরেক্টরিগুলির সাথে মেলে এবং তারপরে নামবেন না
  • -o -printএর অর্থ ফাইলের নামটি প্রিন্ট করুন যদি পূর্বের অভিব্যক্তিটির সাথে কিছু মিল না থাকে। অন্যান্য সমস্ত এক্সপ্রেশন ব্যবহার -printবা -print0ডিফল্টরূপে মুদ্রণের কারণ নয়।

"উদ্বেগজনকভাবে জটিল" সম্পর্কে দয়া করে ব্যাখ্যা / বিস্তারিত ব্যাখ্যা করুন; ইতিমধ্যে দেওয়া উত্তর এবং আপনার উত্তরগুলি বিপরীতে প্রমাণ দেবে বলে মনে হচ্ছে ...?
বাদামি

2
"উদ্বেগজনকভাবে জটিল" সম্ভবত অত্যধিক। আমি পয়েন্টটি পেতে প্রশ্নের উত্তর দিয়েছিলাম। আমি মনে করি আমার পোস্ট করা উত্তরটি বোঝা মুশকিল এবং ম্যান পেজটি খুব যত্ন সহকারে না পড়ে দেখতে পাওয়া শক্ত। আপনি যদি কেবল জিএনইউ অনুসন্ধান ব্যবহার করেন তবে আরও সম্ভাব্য সমাধান রয়েছে।
এলিম্যান

-o ... -printসহায়ক। আমার ব্যবহারের জন্য, আমার কাছে এখন find ... '!' -name . -name '.*' -prune -o ... -printরয়েছে যা $ পিডাব্লুডির তুলনায় বেশি সুবিধাজনক ছিল।
রজার প্যাট

4
find $DIR -not -path '*/\.*' -type f \( ! -iname ".*" \)

সমস্ত লুকানো ডিরেক্টরি এবং hidden DIR এর অধীন লুকানো ফাইলগুলি বাদ দেয়


এটি সঠিক উত্তর। এটি পুনরাবৃত্তভাবে সমস্ত ফাইল সন্ধান করে তবে ডিরেক্টরি এবং লুকানো ফাইলগুলির জন্য লাইন আইটেমগুলি বাদ দেয়। ধন্যবাদ!
কাইলফ্যারিস

2

উত্তর আমি মূলত উপরে আমার মূল প্রশ্নের একটি "সম্পাদনা" হিসেবে পোস্ট:

find . \( ! -regex '.*/\..*' \) -type f -name "whatever", কাজ করে। রেজেক্স "কোনও কিছুর, তারপরে একটি স্ল্যাশ, তারপরে একটি বিন্দু, তারপরে কিছু" (যেমন তাদের সাবফোল্ডারগুলি সহ সমস্ত লুকানো ফাইল এবং ফোল্ডার) এবং "" অনুসন্ধান করে! রেজেক্স অবহেলা।


অনুরূপ, তবে শুধুমাত্র বর্তমান ফোল্ডারের জন্য:find . \( ! -regex './\..*' \) -type f -maxdepth 1 -print
ফায়াত

2

আপনি এটি ব্যবহার করতে হবে না find। শেল ইট-সেল্ফে কেবল গ্লোবস্টার ব্যবহার করুন:

echo **/*foo*

বা:

ls **/*foo*

যেখানে **/কোনও ফোল্ডার পুনরাবৃত্তভাবে এবং তার নামে থাকা *foo*কোনও ফাইল প্রতিনিধিত্ব করে foo

ডিফল্টরূপে ব্যবহার করে lsগোপন ফাইল এবং ডিরেক্টরিগুলি বাদ দিয়ে ফাইলের নাম মুদ্রণ করা হবে।

আপনার যদি গ্লোব্বিং সক্ষম না থাকে তবে এটি দিয়ে করুন shopt -s globstar

দ্রষ্টব্য: একটি নতুন গ্লোব্বিং বিকল্প বাশ 4, জেডএস এবং একই ধরণের শেলগুলিতে কাজ করে।


উদাহরণ:

$ mkdir -vp a/b/c/d
mkdir: created directory 'a'
mkdir: created directory 'a/b'
mkdir: created directory 'a/b/c'
mkdir: created directory 'a/b/c/d'
$ touch a/b/c/d/foo a/b/c/d/bar  a/b/c/d/.foo_hidden a/b/c/d/foo_not_hidden
$ echo **/*foo*
a/b/c/d/foo  a/b/c/d/foo_not_hidden

5
আপনার দরকার নেই ls! echo **/*foo*
কেভিন কক্স

@ কেনর্ব (এবং @ কেভিন-কক্স)। আপনি কিছুটা আরও ভার্বোজ হতে পারেন? কেন গ্লোবস্টার (= *) এখানে কাজ করবে এবং কীভাবে? স্ল্যাশ / কি করে?
বাদামি বাদামি

@ নান্ট্যাবাউটনেটি /মানে ফোল্ডার, এটি ফাইলের নাম থেকে ডিরেক্টরিগুলি পৃথক করে। *মূলত সবকিছু প্রতিনিধিত্ব করে।
কেনারব

@ টেনরব হ্যাঁ-তবে: ওয়ান-লাইনার মূল প্রশ্নে কীভাবে সহায়তা করে?
বাদামি বাদামি

1
@nottyaboutnatty স্পষ্ট এবং উদাহরণ যুক্ত। এটি লুকানোটিকে উপেক্ষা করে ফাইলগুলি সন্ধান করে সহায়তা করে।
কেনারব

1

@ ফ্লিমের উত্তর ভাল, বিশেষত কারণ এটি লুকানো ডিরেক্টরিতে সন্ধান থেকে বাধা দেয় । আমি এই সরলীকরণ পছন্দ:

সাধারণত সমস্ত লুকানো পাথ (নিয়মিত ফাইল, ডিরেক্টরি ইত্যাদি) বাদ দিতে:

find <start-point> -path '*/.*' -prune -o <expression> -print

উদাহরণস্বরূপ, আপনার কার্যক্ষম ডিরেক্টরিটি সূচনা পয়েন্ট -name '*some text*'হিসাবে এবং প্রকাশ হিসাবে:

find . -path '*/.*' -prune -o -name '*some text*' -print

@ ফ্লিমের উত্তরটি যা বোঝায় তার বিপরীতে, কোনও লুকানো ফাইল বা লুকানো ডিরেক্টরিগুলি সহজ বিষয় নয়। -path '*/.*'অভিব্যক্তি কোনো পথ (সাধারণ ফাইল, ডিরেক্টরি, ইত্যাদি) আছে একটি জন্য সত্য ., অবিলম্বে আপনার ফাইল বিভাজক পর /। সুতরাং এই লাইনটি লুকানো ফাইল এবং ডিরেক্টরি উভয়ই ছাঁটাই করবে।

লুকানো ডিরেক্টরিগুলি বাদ দেওয়ার সময় গোপন ফাইলগুলিকে মঞ্জুরি দেওয়া হ'ল এমন ক্ষেত্রে আরও একটি ফিল্টার প্রয়োজন। আপনি যেখানে -type dছড়িয়ে ছিটিয়ে থাকা অভিব্যক্তিটি অন্তর্ভুক্ত করবেন এটি এখানে।

find <start-point> -type d -path '*/.*' -prune -o <expression> -print 

উদাহরণ স্বরূপ:

find . -type d -path '*/.*' -prune -o -name '*some text*' -print

এই ক্ষেত্রে -type d -path '*/.*'হয় trueশুধুমাত্র ডিরেক্টরি জন্য, এবং তাই শুধুমাত্র ডিরেক্টরি ছেঁটে করছে।


0

findঝরঝরে যুক্তিযুক্ত স্যুইচ রয়েছে যেমন -andএবং -notআপনি এগুলিকে দুটি নিয়মের সাথে মিলিয়ে একটি ফাইল খুঁজে পেতে আপনার সুবিধার্থে এগুলি ব্যবহার করতে পারেন:

$ touch non_hidden_file.txt .hidden_file.txt somethings/.another_hidden_file.txt                                                 

$ find . -type f -name '*hidden_file*' -and \( -not -name ".*" \)                            
./non_hidden_file.txt

যেমন আপনি দেখতে পাচ্ছেন, findদুটি নিয়ম ব্যবহার করে -name '*hidden_file*'এবং -and \( -not -name ".*" \)সেই ফাইলের নামগুলি খুঁজে পেতে যা উভয় শর্তের সাথে মেলে - এতে ফাইলের নাম hidden_fileএতে রয়েছে তবে বিন্দু বিন্দু ছাড়াই। প্রথম বন্ধনীর সামনে স্ল্যাশগুলি নোট করুন - সেগুলি findসাবসেলকে সংজ্ঞায়িত করার পরিবর্তে যুক্তি হিসাবে প্যারেনসেসিকে সংজ্ঞায়িত করতে ব্যবহৃত হয় (যা বন্ধনীর অর্থ স্ল্যাশ ছাড়াই অন্যথায় বোঝায়)


0
$ pwd
/home/victoria

$ find $(pwd) -maxdepth 1 -type f -not -path '*/\.*' | sort
/home/victoria/new
/home/victoria/new1
/home/victoria/new2
/home/victoria/new3
/home/victoria/new3.md
/home/victoria/new.md
/home/victoria/package.json
/home/victoria/Untitled Document 1
/home/victoria/Untitled Document 2

$ find . -maxdepth 1 -type f -not -path '*/\.*' | sed 's/^\.\///g' | sort
new
new1
new2
new3
new3.md
new.md
package.json
Untitled Document 1
Untitled Document 2

নোট:

  • . : বর্তমান ফোল্ডার
  • -maxdepth 1পুনরাবৃত্তি অনুসন্ধান করতে অপসারণ
  • -type f: ফাইল অনুসন্ধান করুন, ডিরেক্টরি নয় ( d)
  • -not -path '*/\.*' : ফিরে না .hidden_files
  • sed 's/^\.\///g': ./ফলাফল তালিকা থেকে চাপ দেওয়া অপসারণ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.