মেলানো ডিরেক্টরি থেকে এক স্তরের গভীরে ডিরেক্টরিগুলির তালিকা সন্ধান করুন


13

আমি একটি নির্দিষ্ট ফোল্ডারের মধ্যে থাকা ডিরেক্টরিগুলির একটি তালিকা পাওয়ার চেষ্টা করছি।

এই উদাহরণস্বরূপ ফোল্ডারগুলি দেওয়া:

foo/bar/test
foo/bar/test/css
foo/bar/wp-content/plugins/XYZ
foo/bar/wp-content/plugins/XYZ/js
foo/bar/wp-content/plugins/XYZ/css
baz/wp-content/plugins/ABC
baz/wp-content/plugins/ABC/inc
baz/wp-content/plugins/ABC/inc/lib
baz/wp-content/plugins/DEF
bat/bar/foo/blog/wp-content/plugins/GHI

আমি একটি আদেশ চাই যা ফিরে আসবে:

XYZ
ABC
DEF
GHI

মূলত, আমি ফোল্ডারগুলি সন্ধান করছি যা ডাব্লুপি-কন্টেন্ট / প্লাগইনস / এর ভিতরে রয়েছে

ব্যবহার findআমাকে নিকটতম অর্জিত হয়েছে, কিন্তু আমি ব্যবহার করতে পারবেন না -maxdepth, কারণ ফোল্ডারের অসম আমি কোথায় অনুসন্ধান করছি থেকে দূরে।

নিম্নলিখিত চালনাটি পুনরাবৃত্তভাবে সমস্ত শিশু ডিরেক্টরি প্রদান করে।

find -type d -path *wp-content/plugins/*

foo/bar/wp-content/plugins/XYZ
foo/bar/wp-content/plugins/XYZ/js
foo/bar/wp-content/plugins/XYZ/css
baz/wp-content/plugins/ABC
baz/wp-content/plugins/ABC/inc
baz/wp-content/plugins/ABC/inc/lib
baz/wp-content/plugins/DEF
bat/bar/foo/blog/wp-content/plugins/GHI

উত্তর:


14

কেবলমাত্র একটি যুক্ত করুন -pruneযাতে প্রাপ্ত ডিরেক্টরিগুলি এতে নেমে না যায়:

find . -type d -path '*/wp-content/plugins/*' -prune -print

আপনার *wp-content/plugins/*এটি উদ্ধার করা দরকার যেমন এটি শেল গ্লোবও।

, তাদের সম্পূর্ণ পথ উল্টোদিকে গনুহ সঙ্গে আপনি শুধুমাত্র ডিরেক্টরির নাম চান find, আপনি প্রতিস্থাপন করতে পারেন -printসঙ্গে -printf '%f\n'বা নল উপরোক্ত কমান্ডের আউটপুট অভিমানী ফাইল পাথ সম্পর্কে newline অক্ষর না, awk -F / '{print $NF}'বা sed 's|.*/||'(এছাড়াও অভিমানী ফাইল পাথ ধারণ কেবল বৈধ অক্ষর)।

সহ zsh:

printf '%s\n' **/wp-content/plugins/*(D/:t)

**/সাবডিরেক্টরি কোন স্তর (ইন বৈশিষ্ট্যটি উদ্ভব zshগোড়ার দিকে nighties, এবং এখন দেখতে অন্যান্য অধিকাংশ শাঁস পাওয়া ksh93, tcsh, fish, bash, yashযদিও সাধারণভাবে কিছু বিকল্প অধীনে), (/)ধরনের শুধুমাত্র ফাইল নির্বাচন করতে ডিরেক্টরি , Dগোপন (DOT) বেশী অন্তর্ভুক্ত করা, :tথেকে পেতে লেজ (ফাইল নাম)।


এই সন্ধানটি ডায়ারগুলিতে নতুন লাইনে একটি এ রূপান্তর করবে ?। বাশের জন্য, (প্রশ্নে ট্যাগ হিসাবে) এটি কাজ করে
আইজাক

@ সোরন্টার, findপ্রয়োগগুলি যে কোনও ?বা কোনও প্রতিস্থাপনের অক্ষর বা প্রিন্টযোগ্য অক্ষরগুলির জন্য পালানোর কোনও ধরণের আউটপুট কেবলমাত্র তা করে যখন আউটপুট টার্মিনালে যায়, যখন এটি এখানে পাইপের কাছে যায় না।
স্টাফেন চেজেলাস

আপনার উত্তরে থাকা প্রথম (এবং একমাত্র zsh নয়) কমান্ডটির কোনও পাইপ নেই, এটি আমি পরীক্ষা করেছিলাম এবং এটিই নতুন লাইনের পরিবর্তন করে। যখন পাইপ করা হয়েছিল, যেমনটি আপনি বলেছেন: "ধরে নিচ্ছেন ফাইলের পাথগুলিতে নতুন লাইনের অক্ষর থাকবে না", সুতরাং আপনি ইতিমধ্যে স্বীকার করেছেন যে এটি নিউলাইনগুলিতেও ব্যর্থ হয়।
আইজাক

@ সোরন্টার, দুঃখিত আমি ভেবেছিলাম আপনি দ্বিতীয় অংশে মন্তব্য করে বলছেন যে এটি ঠিক কাজ করবে যেহেতু নতুন লাইনের হাতছাড়া হয়ে যাবে সুতরাং আমাদের যে ধারণাটি তৈরি করছি তা ভাঙবে না sed/ awkসমস্ত ফাইল এক লাইনে রয়েছে। এখন, কেউ তর্ক করতে পারে যে একটি ABC?BCDবা ABC\nBCDইন্টারেক্টিভ / টার্মিনাল আউটপুট জন্য ডাইর জন্য ডাইর জন্য দুটি ABCএবং BCDলাইন পাওয়ার চেয়ে বেশি কার্যকর হবে $'ABC\nBCD। এটি ব্যবহারকারীর উপস্থাপনার পর্যায়ে রয়েছে, আমরা এটিও চিহ্নিত করতে পারি যে নামক কোনও ফাইলের জন্য $'AB\bC', যখন আউটপুট টার্মিনালে যায়, আপনি এমন প্রতিস্থাপন ACছাড়াই দেখতে পাবেন ?...
স্টাফেন চ্যাজেলাস

-র সাথে অনুসন্ধান করুন এবং আউটপুট ফর্ম্যাটটি পরিবর্তন করতে প্রিন্টফ ব্যবহার করে আমাকে ঠিক যা চেয়েছিলাম তা দিয়েছিল। পারফেক্ট - ধন্যবাদ!
নিক

4

ব্যাশ-ically:

shopt -s globstar
printf "%s\n" **/wp-content/plugins/*

কপি করে প্রিন্ট:

bat/bar/foo/blog/wp-content/plugins/GHI
baz/wp-content/plugins/ABC
baz/wp-content/plugins/DEF
foo/bar/wp-content/plugins/XYZ

অথবা

shopt -s globstar
for d in **/wp-content/plugins/*; do printf "%s\n" ${d##*/}; done

কপি করে প্রিন্ট:

GHI
ABC
DEF
XYZ

নাহ, এটি ডায়ারের ভিতরেও ফাইল মুদ্রণ করবে। আমার উত্তর পড়ুন দয়া করে।
ইসহাক

ভাল যুক্তি; ধন্যবাদ! আমি তাদের ডিরেক্টরি কাঠামো পুনরায় তৈরি করেছি, তবে সেগুলিতে পরীক্ষার ফাইল রাখি নি।
জেফ শ্যাচলার

4

আপনি findপুনরাবৃত্তি করতে পারেন , সাজানোর:

find / -type d -path *wp-content/plugins -exec find {} -maxdepth 1 -mindepth 1 -type d \;

3

ব্যাশ জন্য: সরল (সঙ্গে ফাইল / dirs জন্য কাজ স্পেস এবং নতুন লাইন ):

shopt -s globstar                    # allow ** for several dirs.
a=(**/wp-content/plugins/*/)         # capture only wanted dirs.
a=("${a[@]%/}")                      # remove trailing slash (dirs) `/`.
printf '%s\n' "${a[@]##*/}"          # print only the last dir name.

Wll মুদ্রণ:

GHI
ABC
DEF
XYZ

এমনকি যদি ফাইল তৈরি হয়।


মনে রাখবেন যে এটি লুকানো ডিয়ারগুলির মধ্যে দেখায় না, লুকানো ফাইলগুলি এড়িয়ে যায় ( dotglobযদি এটি অযাচিত হয় তবে বিকল্পটি দেখুন ) এবং ডিরেক্টরিগুলি ছাড়াও ডিরেক্টরিগুলিতে সিমলিংকগুলি অন্তর্ভুক্ত থাকে ( **এছাড়াও ব্যাশ ৪.২ এবং এর আগে সিমলিংকগুলিও অতিক্রম করবে)।
স্টাফেন চেজেলাস

@ StéphaneChazelas লুকানো ফাইল? প্রশ্নটি কারও জন্যই জিজ্ঞাসা করে না, কেবল ডায়ার করে। হ্যাঁ, লুকানো ডায়ারগুলি স্বাধীনভাবে নির্বাচিত হতে পারে (একটি বৈশিষ্ট্য হিসাবে, যদি ইচ্ছা হয়)। এবং হ্যাঁ, সিমলিংকগুলি ব্যাশের বর্তমান সংস্করণে ট্রান্সভার্স নয়।
আইজাক

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

3

treeকমান্ড এই কাজের জন্য ঠিক ডিজাইন করা হয়েছে। -Lপতাকা দিয়ে গভীরতা নিয়ন্ত্রণ করা যায় । স্থানীয় ওয়ার্ডপ্রেস সাইটের একটি উদাহরণ যা আমি রক্ষণ করি:

$ tree -L 1 wp-content/
wp-content/
├── index.php
├── plugins
└── themes

2 directories, 1 file

$ tree -L 2 wp-content/
wp-content/
├── index.php
├── plugins
   ├── akismet
   ├── contact-form-7
   ├── index.php
   └── wordpress-seo
└── themes
    ├── index.php
    ├── twentyfifteen
    └── twentysixteen

11 directories, 3 files

$ tree -L 1 wp-content/plugins/
wp-content/plugins/
├── akismet
├── contact-form-7
├── index.php
└── wordpress-seo

5 directories, 1 file

1

ডোপঘোটির জবাবের ভিত্তিতে বিল্ডিং, কীভাবে মিলবে লুপ:

find / -type d -iregex '.*/wp-content/plugins' -print0 | while read -r -d $'\0' D; do
    find "$D" -maxdepth 2 -mindepth 1
done

এইভাবে এটি করার কারণটি হ'ল আপনি এটি একাধিকের সাথে বিভ্রান্ত / জটিল মনে করতে পারেন -exec, যদিও এখনও p n 'ইত্যাদি সম্বলিত ফাইল নামগুলির সমস্যাগুলি এড়িয়ে চলেছেন \


0

আপনি যা শুরু করেছেন তার উপর ভিত্তি করে:

find -type d -path *wp-content/plugins/* | egrep -o "wp-content/plugins/[^/]+($|/)" | sed -r "s~wp-content/plugins/([^/]+)($|/)~\1~" | uniq  

উদাহরণস্বরূপ * ডাব্লুপি-কনটেন্ট / প্লাগইন / * এবং পরবর্তী স্ল্যাশ / বা লাইনের শেষ পর্যন্ত কোনও অক্ষর bs - এতে আপনি যে অংশটি চান তা অন্তর্ভুক্ত রয়েছে।

সেড , একটি ~ ডিলিমিটার সহ, প্রথম বন্ধনীর প্রথম সেট () ব্যবহার করে আপনি যে অংশটি চান তা নির্বাচন করে এবং সবকিছুর প্রতিস্থাপন হিসাবে \ 1 (আপনি যা চান) ব্যবহার করেন

ইউনিট নকল ফলাফল ফিল্টার আউট

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