একাধিক ফোল্ডারের নামে ফাইলগুলি সন্ধান করুন


44

আমি তালিকায় চেষ্টা করছি ফাইলগুলি থেকে আর dir1, dir2, dir3এবং dir4যা আমার এর একটি উপ ডিরেক্টরির যেমন যে কোন জায়গায় হতে পারে cwdব্যবহার findকমান্ড। আমি কোনও সাফল্য ছাড়াই নিম্নলিখিতগুলি চেষ্টা করেছি:

find . -type f -regextype posix-egrep -regex 'dir1/.+|dir2/.+|dir3/.+|dir4/.+'

আমিও চেষ্টা posix-extendedকরেছি। আমি এই ফাইলগুলি কীভাবে তালিকাবদ্ধ করতে পারি?


খুঁজে। -type f -regextype sed -regex "। * / দির [1-4] / [a-z0-9] *" .. এখন পর্যন্ত সংক্ষিপ্ত উত্তর :) নীচে উত্তর দেখুন .. unix.stackexchange.com/a/390333 / 242983
alpha_989

উত্তর:


59

আর তুমি কি তিন ফোল্ডার নামে অনুসন্ধান করতে চান তাহলে foo, barএবং bazসবার জন্য *.pyফাইল, এই কমান্ড ব্যবহার করুন:

find foo bar baz -name "*.py"

সুতরাং আপনি যদি dir1 dir2 dir3ব্যবহার থেকে ফাইলগুলি প্রদর্শন করতে চানfind dir1 dir2 dir3 -type f

এটা চেষ্টা কর find . \( -name "dir1" -o -name "dir2" \) -exec ls '{}' \;


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

এর ./dirপরিবর্তেdir
harish.venkat

দিরটিকে এখনও সিডব্লিউডে থাকা দরকার যদিও এটি দুটি স্তর কম (যেমন ./path/to/dir1) হতে পারে , যার ক্ষেত্রে ./dir1অস্তিত্ব নেই।
হারুন

উত্তর সম্পাদনা।
harish.venkat

8

-পথ নির্দেশিকা ব্যবহার করা ভাল:

find .  \( -type f -and -path '*/dir1/*' -or -path '*/dir2/*' -or -path '*/dir3/*' -or -path '*/dir4/*' \)

যার অর্থ: বর্তমান ডিরেক্টরিতে সমস্ত ফাইল সন্ধান করুন যেখানে 'dir1' বা 'dir2' বা 'dir3' বা 'dir4' রয়েছে।


আপনি ভুল জায়গায় প্রথম বন্ধনী পেয়েছেন। আরও দেখুন -aএবং -oগনুহ এর মান সমতুল্য জন্য -and/ -or
স্টাফেন চেজেলাস

4

শুধু সবাইকে জানাতে। যোগ করার পদ্ধতি .*/প্রতিটি সামনে dirথেকে সমস্যার সমাধান regexসম্পূর্ণ পথ মনে হয় বিরুদ্ধে ম্যাচিং হয়।


3

পূর্ববর্তী উত্তরগুলি পড়ার পরে এটি আমার প্রথম ধারণা:

find . -type f -regextype posix-egrep -regex ".*/(dir1|dir2|dir3|dir4)/.+"

এটি অ্যাকাউন্টে বিবেচনা করে, রেজেক্স অবশ্যই পুরো ফাইলের সাথে মেলে, এবং এটি বোঝা সহজ।


2

ওয়াইল্ডকার্ড (হোম ডিরেক্টরি) এবং সাধারণ অ্যাপাচি 2 লগ ডিরেক্টরি প্রয়োগ করে এসএসএল লগ এবং জিজেপড পুরাতন লগগুলি বাদ দেওয়ার জন্য ফিল্টারিংয়ের নামও প্রয়োগ করে দ্রুত (!) নির্দিষ্ট ফাইলগুলি (অ্যাক্সেস-লগ) সন্ধানের নমুনা। এখানে সরাসরি প্রশ্নের উত্তর দেয় না তবে এই নির্দেশাবলীটি (যেমন আমার মত) খুঁজে পেয়েছে তার পক্ষে দরকারী হতে পারে।

find / \( -path "*var/log/apache2*" -o -path "*home/*/logs*" \) -type f  -name "*access_log" ! -name "*ssl*"

স্পেসগুলি সম্পর্কে বিশেষ সতর্কতার সাথে \(এবং কাছাকাছি থাকুন \)

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

apachetop -d1 -s9 -p $(find / \( -path "*var/log/apache2*" -o -path "*home/*/logs*" \) -type f  -name "*access_log" ! -name "*ssl*" -print | sed 's/^/-f '/)

2

আপনি যদি regextype ব্যবহার করে থাকেন তবে আপনাকে নাম দ্বারা dir1 থেকে dir4 নির্দিষ্ট করতে হবে না

find . -type f -regextype sed -regex ".*/dir[1-4]/[^/]*"
  • type f: ডিরেক্টরি ডিরেক্টরি না ফাইল সন্ধান করুন
  • regextype sed: সেড রিজেক্সটাইপ ব্যবহার করে
  • regex: পুরো পথে রেজেক্স ব্যবহার করে অনুসন্ধান করে
  • ".*/dir[1-4]/[a-z0-9]*":। * শুরুতে এর অর্থ সংখ্যক অক্ষর (চর / সংখ্যা / ব্যাকস্ল্যাশ (/) ইত্যাদি) হতে পারে; দির [১-৪] এর অর্থ 1 থেকে 4 এর মধ্যে একটি সংখ্যার পরে "দির" সন্ধান করুন; / [^ /] * বলেছে যে dir1-4 অনুসরণ করে / এর মধ্যে থাকা কোনও পাথের নাম বাদ দেয়, সুতরাং এটি কেবল dir1-dir4 ডিরেক্টরিতে ফাইল দেয় এবং dir1-dir4 এর মধ্যে থাকা কোনও উপ-ডিরেক্টরিকে উপেক্ষা করে।

এটি পরীক্ষা করার জন্য আপনার জন্য একটি ডিরেক্টরি তৈরি করেছে: https://github.com/alphaCTzo7G/stackexchange/tree/master/linux/findSolution04092017


(1) আমরা হারুনের সঠিক পরিস্থিতি বা প্রয়োজনীয়তাগুলি কখনই জানতে পারি না, তবে অন্যান্য উত্তরগুলি বুদ্ধিমান সিদ্ধান্ত নিয়েছে যে তার চারটি ডিরেক্টরি রয়েছে, যার নাম অনির্ধারিত। (তারা হতে পারে red, green, blueএবং yellowবা তাদের যেটি হতে পারে John, Paul, Georgeএবং Ringo।) আপনার উত্তর অনুমান তারা যে আক্ষরিক dir1 , dir2, dir3এবং dir4। … (চালিয়ে যাওয়া)
স্কট

(চালিয়ে যাওয়া) ... (২) আপনি কেন ধরে নিয়েছেন যে হারুন সাব-ডিরেক্টরিগুলি অনুসন্ধান করতে চান না? সে মনে হচ্ছে যে সে করছে does (3) কেন আপনি ফাইল সার্চ যাদের নাম সীমাবদ্ধ হয় থাকতে শুধুমাত্র ছোট হাতের অক্ষর ও স w খ্যা (ভালো জিনিস ব্যতীত foo_bar, foo.txtএবং FOO)? (৪) /[^/]*আপনার উত্তর যখন এটি ব্যবহার না করে কেন আপনার পাঠ্যটি ব্যাখ্যা করে?
স্কট

হাই স্কট, আপনার মন্তব্যের জন্য ধন্যবাদ।
alpha_989

(1-3)। তিনি উল্লেখ করেছেন "আমি dir1, dir2, dir3 এবং dir4 থেকে সমস্ত ফাইল তালিকাভুক্ত করার চেষ্টা করছি " যা আমার সিডব্লিউডির উপ ডিরেক্টরি হিসাবে যে কোনও জায়গায় থাকতে পারে , যার অর্থ dir1-dir4 যে কোনও জায়গায় থাকতে পারে তবে তিনি ফাইলটি সঠিকভাবে সন্ধান করতে চান dir1-dir4 মধ্যে। অবশ্যই, এটি dir1-dir4 না হলে, আপনাকে লাল using | নীল \ | সবুজ \ | ব্যবহার করে নির্দিষ্ট নামগুলিতে এটি পরিবর্তন করতে হবে ইত্যাদি ..
alpha_989

৪. সেখানে টাইপ করুন .. আমি [a-z0-9] * এর আগে ব্যবহার করেছি..এর পরে বুঝতে পেরে [^ /] * স্বল্প এবং আরও বেশি অন্তর্ভুক্ত..আমি এটি পোস্ট করার সময় এটি পরিবর্তন করার জন্য ব্যর্থ। আপনার সাবধানী মন্তব্যের জন্য ধন্যবাদ।
alpha_989

0

আমি জানি যে আপনি সুনির্দিষ্টভাবে সন্ধানটি নির্দিষ্ট করেছেন, তবে কেবলমাত্র অন্যান্য বিকল্পগুলি ব্যবহার করতে পারেন যা ব্যবহার করতে পারেন, আপনি xargs ব্যবহার করতে পারেন:

find . -type d | grep -E "dir1$|dir2$" | xargs ls  

find . -name "dir1" -or -name "dir2" | xargs ls

আপনার কাছে "ফোল্ডার" নামে একটি ফাইল থাকতে পারে যার মধ্যে এমন কিছু রয়েছে:

$ cat folders
dir1
dir2
dir3
dir4

তারপরে, আপনি এর মতো কিছু করতে পারেন:

$ cat folders | xargs -I % find . -type d -name % | xargs ls
./Documents/dir1:
file1  file2  file3  file4

./Documents/dir2:
file1  file2  file3  file4

./Documents/dir3:
file1  file2  file3  file4

./Documents/dir4:
file1  file2  file3  file4

আমার মতে xargs, আমি সন্ধানী-এক্সেকের চেয়ে বেশি বহুমুখী বোধ করি। এছাড়াও আপনি কিছু ক্রেজি স্টাফ তৈরি করতে পারেন

$ cat << EOF | xargs -I {} find ~ -name "{}" | xargs ls
> dir1
> dir2
> dir3
> EOF
/home/user/Documents/dir1:
file1  file2  file3  file4

/home/user/Documents/dir2:
file1  file2  file3  file4

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