একই নামের সাথে সমস্ত ডিরেক্টরিতে সাব-ডিরেক্টরিগুলি সন্ধান করা


8

আমি একটি কমান্ড চালাতে চাই:

  1. " inc" একটি ফোল্ডারের নীচে " " নামের সমস্ত ডিরেক্টরি সন্ধান করুন X
  2. প্রতিটি " X/.../inc/" এর অধীনে সমস্ত উপ-ডিরেক্টরি তালিকাভুক্ত করুন ।
  3. " list" নামের একটি ফাইলে আউটপুট পুনর্নির্দেশ করুন

আমি সফলতা ছাড়াই নীচের কমান্ডের বিভিন্ন সংমিশ্রণ চেষ্টা করেছি:

$ find X/ -name "inc" -print | xargs find {} -type d > list
find: path must precede expression

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

উত্তর:


13

find নিজে থেকে এই সব করতে পারেন:

find X -path '*/inc/*' -type d > list

আরও তথ্যের জন্য -pathঅংশ পড়ুন man find

আমি যেমন একটি মন্তব্যে দ্রুত উল্লেখ করেছি: আপনি যদি কোনও পাঠ্য ফাইলে পৃথক ডিরেক্টরি রেখাগুলি সঞ্চয় করেন তবে নতুন লাইনের সমন্বিত ডিরেক্টরিগুলির নামটি দ্ব্যর্থহীনভাবে উপস্থাপনযোগ্য হবে না। আপনি যদি নিশ্চিত হন যে ডিরেক্টরিতে নতুন লাইন থাকে না তবে তা ঠিক। শুধু একটি সাধারণ মন্তব্য।



অথবা এক্স-নাম '
ইনক'

@ ম্যাক্লিওড: না, এটি প্রশ্ন নয়।
ড্যানিয়েল অ্যান্ডারসন

4

এখানে একটি সহজ ওয়ান-লাইনার:

find X -type d -name "inc" -exec sh -c 'find {} -type d' \; > list

এটি findপ্রথম findফলাফলের প্রত্যেকটিতে চলে । execআমি আগেই বলেছি - - বিকল্পটি একটি ন্যূনতম শেল কমান্ড, যা গ্রহণ করতে পারেন {}প্রথম প্রতিটি ডিরেক্টরির দিয়ে প্রতিস্থাপিত হয় find

দ্বিতীয়টি find, আপনার অনুরোধ অনুযায়ী, incডিরেক্টরি সহ প্রথম ফলাফলগুলির "সমস্ত উপ-ডিরেক্টরিগুলি তালিকাবদ্ধ করুন" । আপনি যদি আউটপুটে নিজেই তা না চান তবে দ্বিতীয়টিকে find কমপক্ষে গভীরতার 1 আউটপুট ফোল্ডারটি দিন।

find X -type d -name "inc" -exec sh -c 'find {} -mindepth 1 -type d' \; > list

আমরা তখন মাত্র কমান্ডের পুনঃনির্দেশ করবে stdoutমধ্যে list


যেখানে আমি শুধু আসল মিল গভীরতা 1 সাব ডিরেক্টরি চেয়েছিলেন যে উত্তরে একটি পরিবর্তন আমাকে সহায়ক ছিল find path -name inc -type d -exec sh -c 'find {} -mindepth 1 -maxdepth 1 -type d' \;
কোর

1

ঠিক আছে আমি এই নেস্টেড সন্ধানের অনুকরণের উত্তরটি পেয়েছি:

find X/ -type d | grep "/inc/" > list

খুব ভাল, ও কাজ করবে! যাইহোক, ইউনিক্স / লিনাক্স শেল মধ্যে, সত্যিই যেমন জিনিস আছে উত্তর। এটি ব্যক্তিগত পছন্দসমূহ এবং মেনে চলা সহজ of
বিশাল কোচরেলকোটা

অপ্রচলিত (তবে বিদ্যমান) ফাইলের নাম যেমন নিউলাইনগুলি সহ যত্ন নেওয়া: find X/ -type d -print0 | awk 'BEGIN{RS="\0"}/\/inc\//' > list( grep -zনাল চরিত্রের উপরও বিস্মৃত হয়, তবে এর আউটপুটটিও নালকে পৃথক করা হয়েছে বলে মনে হচ্ছে, সুতরাং এটির মাধ্যমে xargs -0L1 echoলাইন ধরে রেখার জন্য এটির মাধ্যমে পাইপ লাগাতে হবে one )। এই ক্ষেত্রে, যেহেতু আপনি নিউলাইনের দ্বারা বিভক্ত প্রতিটি এন্ট্রি দিয়ে ফাইল ফাইল করার জন্য তালিকা সংরক্ষণ করছেন, ফাইলের নামের নতুন লাইনগুলি এখনও অস্পষ্টভাবে উপস্থাপন করা হবে। আপনি তালিকার সাথে কী করতে চান তার উপর নির্ভর করে সম্ভবত আপনার মধ্যবর্তী ফাইলেরও দরকার নেই।
ড্যানিয়েল অ্যান্ডারসন

1

এটা চেষ্টা কর:

   find path-of-x -path '*/inc/*' -type d > list

এখনই এটি পরীক্ষা করার জন্য আমার কাছে লিনাক্স মেশিন নেই ...
প্রিন্স জন ওয়েসলি

এটি কাজ করে না। তবে আমাকে পরামর্শ দেওয়ার জন্য ধন্যবাদ "\inc\":)
iammilind

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