আমি কীভাবে `Find` ব্যবহার করে প্রস্থের প্রথম অনুসন্ধান করতে পারি?


17

-depthপ্রাথমিক findএটা গভীরতায় প্রথম অনুসন্ধান সঞ্চালন করতে হয়।

যাইহোক, ডিফল্ট ক্রম না একটি পানা প্রথম অনুসন্ধান।

ডিফল্ট ক্রমটি অনানুষ্ঠানিকভাবে একটি "গভীরতা-প্রথম ট্র্যাভারসাল" হিসাবে বর্ণনা করা যেতে পারে যা ব্যাকট্র্যাকিংয়ের সময় এটি করার চেয়ে প্রথমে মুখোমুখি হলে নোডগুলি পরিচালনা করে ।

আমার প্রথম প্রস্থের অনুসন্ধানের প্রকৃত প্রয়োজন। আমি কীভাবে findএইভাবে আচরণ করতে পারি ?


উদাহরণস্বরূপ, নিম্নলিখিত সেটআপ সহ:

$ mkdir -p alpha/{bravo,charlie,delta}
$ touch alpha/charlie/{alpha,beta,gamma,phi}

find নিম্নলিখিত ডিফল্ট আচরণ আছে:

$ find alpha
alpha
alpha/charlie
alpha/charlie/alpha
alpha/charlie/phi
alpha/charlie/beta
alpha/charlie/gamma
alpha/delta
alpha/bravo

এবং সহ -depth, এটি নিম্নলিখিত হিসাবে সম্পাদন করে:

$ find alpha -depth
alpha/charlie/alpha
alpha/charlie/phi
alpha/charlie/beta
alpha/charlie/gamma
alpha/charlie
alpha/delta
alpha/bravo
alpha

যাইহোক, আমি যা চাই তা নিম্নলিখিত (কল্পিত) বিকল্প:

$ find alpha -bfs
alpha
alpha/charlie
alpha/delta
alpha/bravo
alpha/charlie/alpha
alpha/charlie/phi
alpha/charlie/beta
alpha/charlie/gamma

অন্য কথায় আমাকে আরও এগিয়ে যাওয়ার আগে একটি নির্দিষ্ট গভীরতায় সমস্ত ফাইল / ডায়ারগুলির findপ্রক্রিয়া / প্রতিবেদন করা দরকার ।

কিভাবে আমি এটি করতে পারব?


সাথে নয় find(অন্তত, কেবল সাথে নয় find)। আপনি কি কেবল ফাইলগুলির তালিকা তৈরি করতে চান, বা আপনি অন্যান্য প্রাথমিকগুলি ব্যবহার করতে চান?
গিলস 'তাই মন্দ হওয়া বন্ধ করুন'

@ গিলস, আসলে আমি বুঝতে পেরেছিলাম যে -bfsআমার যা প্রয়োজন ঠিক তা হবে না ... আমার কাছে একটি সহজ স্ক্রিপ্ট রয়েছে যা গিটল্যাব উইকিতে অন্তর্ভুক্তির জন্য উপযুক্ত একটি বৃহত গিটল্যাব প্রকল্পে একটি সূচক তৈরি করে। এটি হেডারগুলি হায়ারার্কিকভাবে ডিরেক্টরি নামের উপর ভিত্তি করে তোলে। এটি কাজ করে মহান, উদাহরণস্বরূপ ফাইল কাঠামো ছাড়া উপরে তা দিয়া deltaঅধীনে charliesubheader, পরিবর্তে পিতা বা মাতা অধীনে alphaহেডার।
ওয়াইল্ডকার্ড

আরেকটি অদ্ভুত জিনিস যে আমার হয় findআউটপুট হয় বর্ণানুক্রমে সাজানো। কেন ধারণা নেই ....
ওয়াইল্ডকার্ড

তবুও, আমি মনে করি -bfs এটি ব্যবহারে আসতে পারে , যদিও এটি ব্যবহারের ক্ষেত্রে এটি পুরোপুরি ফিট করে না।
ওয়াইল্ডকার্ড

2
আমি এ জাতীয় একটি সরঞ্জাম প্রয়োগ করেছি: বিএফএস । এটি এখনও জিএনইউ সন্ধানের সাথে 100% বৈশিষ্ট্যযুক্ত নয়, তবে এটি সেখানে পৌঁছেছে getting
তাভিয়ান বার্নস

উত্তর:


6

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

pattern='*'
set -- $pattern
while [ $# -ne 1 ] || [ "$1" != "$pattern" ]; do
  for file; do
    …
  done
  pattern="$pattern/*"
  set -- $pattern
done

এটি ডট ফাইলগুলি মিস করে। ব্যবহার করুন FIGNORE='.?(.)'ksh এ, shopt -s dotglobব্যাশ, বা setopt glob_dotszsh তাদের অন্তর্ভূক্ত করে নেয়।

আদেশ সহকারে:

  • যদি প্রচুর ফাইল থাকে তবে এটি মেমোরিটিকে উড়িয়ে দেবে।
  • এটি ডিরেক্টরিগুলির প্রতীকী লিঙ্কগুলিকে পুনরাবৃত্তিতে অনুসরণ করে।

আপনি যদি আদেশ বা ডিরেক্টরি এবং নন-ডিরেক্টরি বাছাই করতে চান এবং কার্য সম্পাদনটি গুরুত্বপূর্ণ না হয় তবে আপনি [ -d "$file" ]প্রতিটি পাসে দুটি পাস এবং পরীক্ষা করতে পারেন ।


@ উইল্ডকার্ড হ্যাঁ, আমি করেছি।
গিলস 'অসন্তুষ্ট হওয়া বন্ধ করুন'

1
নিস! আরও একটি তুচ্ছ সতর্কতা: ফাইলটির আক্ষরিক নাম দেওয়া থাকলে ডিরেক্টরিতে লোন ফাইল এমন কোনও ফাইল প্রক্রিয়া করতে ব্যর্থ হবে *। :)
ওয়াইল্ডকার্ড

@ ওল্ডকার্ড ওহ, হ্যাঁ, আমি এটি উল্লেখ করতে ভুলে গেছি। এই প্রান্তের কেসটি এড়াতে ল্যাশ শর্ত হিসাবে ব্যাশ বা জেডশ nullglobব্যবহার করুন (($#))
গিলস 'অসন্তুষ্ট হওয়া বন্ধ করুন'

5

# cat ./bfind

#!/bin/bash
i=0
while results=$(find "$@" -mindepth $i -maxdepth $i) && [[ -n $results ]]; do
  echo "$results"
  ((i++))
done

এটি গভীরতা findএবং পুনরাবৃত্তি করে কাজ করে , আমি মনে করি এটি ফলাফল পুনরাবৃত্তি করতে পারে, তবে সহজেই ফিল্টার করা যেতে পারে


দুঃখিত আমি ফর্ম্যাটিং প্রক্রিয়া সম্পর্কে জানতাম না। যাইহোক, আসলে এটি আমার পুনরাবৃত্তি বলে মনে হয় না কারণ এটি মানসিকতার চেয়ে কম কিছু কেটে দেয়
user239175

3

আপনি এটিকে findএকটি সাজানোর মধ্যে পাইপ করতে পারেন যা প্রাথমিকভাবে /পথের নামের অক্ষরের সংখ্যা অনুসারে বাছাই করে । উদাহরণ স্বরূপ,

find alpha |
awk '{n=gsub("/","/",$0);printf "%04d/%s\n",n,$0}' |
sort -t/ |
sed 's|[^/]*/||'

এটি awkস্ল্যাশের সংখ্যার সাথে পাথের নামটি sedউপসর্গ করতে এবং শেষে এই উপসর্গটি সরাতে ব্যবহার করে।

প্রকৃতপক্ষে, আপনি সম্ভবত ডিরেক্টরি বিষয়বস্তুগুলির alpha/charlie+পরে তালিকাবদ্ধ হতে চান alpha/charlie, আপনার sort -t/ -k1,1 -k2,2 -k3,3 -k4,4পছন্দসই গভীরতা পর্যন্ত বলতে হবে ।


0

'সন্ধান' এর ভিত্তিতে নয় বরং বাশের উপর ভিত্তি করে আরও একটি উত্তর - প্রথমে "প্যারেন্ট ডিরেক্টরের দৈর্ঘ্য" ব্যবহার করুন, তারপরে আলফা অনুসারে বাছাই করুন।

উত্তরটি বেশ মিলছে না কারণ আপনার ফলাফলগুলিতে "চার্লি, ব্র্যাভো, ডেল্টা" রয়েছে তবে আমি ভাবলাম এটি আলফা ক্রমে "ব্রাভো, চার্লি, ডেল্টা" হওয়া উচিত কিনা।

paths_breadth_first() {
  while IFS= read -r line; do
    dirn=${line%/*}         ## dirname(line)
    echo ${#dirn},$line     ## len(dirn),line
  done | sort -n | cut -d ',' -f 2-
}

যে উত্পাদন করে

  $ cat /tmp/yy | paths_breadth_first 
  alpha
  alpha/bravo
  alpha/charlie
  alpha/delta
  alpha/charlie/alpha
  alpha/charlie/beta
  alpha/charlie/gamma
  alpha/charlie/phi
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.