অনুসন্ধান ব্যবহার করে একটি উপ-ডিরেক্টরি বাদ দিন


115

আমার মত ডিরেক্টরি কাঠামো আছে

data
|___
   |
   abc
    |____incoming
   def
    |____incoming
    |____processed
   123
    |___incoming
   456
    |___incoming
    |___processed

ডেটা ডিরেক্টরিতে সমস্ত ফোল্ডারে একটি আগত সাব-ফোল্ডার রয়েছে। আমি Def / ইনকামিং এবং 456 / ইনকামিং ডায়ার ব্যতীত সমস্ত ফোল্ডার এবং সাব-ফোল্ডার থেকে সমস্ত ফাইল পেতে চাই। আমি নিম্নলিখিত কমান্ড দিয়ে চেষ্টা করেছি

 find /home/feeds/data -type d \( -name 'def/incoming' -o -name '456/incoming' -o -name arkona \) -prune -o -name '*.*' -print

তবে এটি প্রত্যাশার মতো কাজ করছে না।

রবি


3
এটি ভাল পরামর্শ নয়, তবে এটি আপনাকে দ্রুত এবং নোংরা পরিস্থিতিতে থেকে অনেকটা বের করে আনবে: grep -v somethingআপনি যা চান না তা বাদ দেওয়ার জন্য পাইপ
মিকেল

উত্তর:


206

এইটা কাজ করে:

find /home/feeds/data -type f -not -path "*def/incoming*" -not -path "*456/incoming*"

ব্যাখ্যা:

  • find /home/feeds/data: নির্দিষ্ট পাথ থেকে পুনরাবৃত্তভাবে সন্ধান শুরু করুন
  • -type f: কেবল ফাইলগুলি সন্ধান করুন
  • -not -path "*def/incoming*": def/incomingএর পথের অংশ হিসাবে কিছু অন্তর্ভুক্ত করবেন না
  • -not -path "*456/incoming*": 456/incomingএর পথের অংশ হিসাবে কিছু অন্তর্ভুক্ত করবেন না

একটি ত্রুটি পেয়ে "খুঁজে বার করুন: খারাপ বিকল্প-সন্ধান নয়: পাথ-তালিকা প্রিডিকেট-তালিকা"
রবি

@ রবি আপনি কি বাশ শেল ব্যবহার করছেন? আমি এটি কেবল আমার টার্মিনালে পরীক্ষা করেছি এবং এটি আমার পক্ষে কাজ করে। আপনি যদি আপনার স্ক্রিপ্টে পরিবর্তন করে থাকেন তবে এর পরিবর্তে সমাধানটি অনুলিপি এবং আটকানোর চেষ্টা করুন।
সাম্পসন-চেন

এটি কাজ করছে, তবে, এটি ডায়ারগুলির তালিকা তৈরি করে those ডায়ারগুলিতে ফাইল নয়।
রবি

1
-pathপুরো স্ট্রিংয়ের সাথে মেলে, তাই যদি আপনি এটি করেন find .তবে আপনার -pathস্ট্রিংগুলি হওয়া দরকার./path/to/directory/*
হিথ বর্ডার

1
এফওয়াইআই -not -pathঅবশ্যই এই উদাহরণে কাজ করবে তবে findএটি এখনও ডিরেক্টরি কাঠামোর মধ্যে পুনরাবৃত্তি করছে এবং সিপিইউ চক্রটি সমস্ত ডিরেক্টরি / ফাইলগুলিতে পুনরাবৃত্তি করতে ব্যবহার করছে। findএই ডিরেক্টরিগুলি / ফাইলগুলির মাধ্যমে পুনরাবৃত্তি হওয়া থেকে রক্ষা করতে (সম্ভবত সেখানে কয়েক মিলিয়ন ফাইল রয়েছে) তবে আপনাকে ব্যবহার করতে হবে -prune(তবে -pruneবিকল্পটি ব্যবহার করা কঠিন)।
ট্রেভর বয়েড স্মিথ

9

কেবলমাত্র ডকুমেন্টেশনের খাতিরে: আপনাকে অনেকগুলি গভীর অনুসন্ধান করতে হতে পারে কারণ এখানে অনেকগুলি অনুসন্ধানের নক্ষত্র রয়েছে (যেমন আমার ছিল) I এটি pruneআপনার বন্ধু যখন হতে পারে-not -path আপনি যা প্রত্যাশা করেন তা করেন না।

সুতরাং এটি 15 এর মূল্যবান উদাহরণ যা উদাহরণগুলি ডিরেক্টরি বাদ দেয়:

http://www.theunixschool.com/2012/07/find-command-15-examples-to-exclude.html

প্রাথমিক প্রশ্নের সাথে লিঙ্ক করতে, অবশেষে বাদ দিয়ে আমার পক্ষে এইভাবে কাজ করেছে:

find . -regex-type posix-extended -regex ".*def/incoming.*|.*456/incoming.*" -prune -o -print 

তারপরে, আপনি যদি একটি ফাইল সন্ধান করতে এবং এখনও প্যাথগুলি বাদ দিতে চান তবে কেবল যুক্ত করুন | grep myFile.txt

এটি আপনার অনুসন্ধান সংস্করণেও নির্ভর করতে পারে। আমি দেখি:

$ find -version
GNU find version 4.2.27
Features enabled: D_TYPE O_NOFOLLOW(enabled) LEAF_OPTIMISATION SELINUX

5

-nameকেবল ফাইলের সাথে মেলে, পুরো পথটি নয়। -pathপরিবর্তে আপনি যে অংশগুলিতে ডিরেক্টরিগুলি ছাঁটাই করছেন তার জন্য আপনি ব্যবহার করতে চান def/incoming


2
find $(INP_PATH} -type f -ls |grep -v "${INP_PATH}/.*/"

7
কিছু ব্যাখ্যা এটি আরও ভাল উত্তর দিতে পারে।
ক্রিস লুয়েংগো

এই কোড স্নিপেটের জন্য আপনাকে ধন্যবাদ, যা কিছু সীমিত স্বল্পমেয়াদী সহায়তা সরবরাহ করতে পারে। একটি সঠিক ব্যাখ্যা কেন এটি সমস্যার একটি ভাল সমাধান তা দেখিয়ে তার দীর্ঘমেয়াদী মানকে ব্যাপকভাবে উন্নত করবে এবং ভবিষ্যতে পাঠকদের আরও অন্যান্য অনুরূপ প্রশ্নের সাথে আরও দরকারী করে তুলবে। আপনার অনুমানগুলি সহ কিছু ব্যাখ্যা যুক্ত করতে দয়া করে আপনার উত্তরটি সম্পাদনা করুন
শন সি।

1
দ্রষ্টব্য: এই ট্রিকটি যদি কাজ না করে তবে যদি find ... -print0কোনও পরে ব্যবহার করেxargs -0
phs

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