একটি গাছের সব শেষ উপ-ডিরেক্টরিগুলি সন্ধান করুন


11

নিম্নলিখিত কাঠামো দেওয়া:

oz123@debian:~/ $ tree .
.
├── a
│   ├── a1
│   ├── a2
│   └── a3
├── a1
│   ├── a11
│   ├── a12
│   └── a31
├── b
│   └── b1
│       ├── b11
│       │   └── b21
│       │       └── b31
│       ├── b12
│       └── b3
└── c

16 directories, 0 files

আমি সমস্ত শেষ নোডগুলি কীভাবে খুঁজে পাব?

আমি নিম্নলিখিত সমাধানগুলি পেয়েছি যা দেখতে ভাল বলে মনে হয়েছে, তবে আমার প্রমাণ করতে হবে যে পরীক্ষার কেস নেই যা এটি ব্যর্থ হবে।

-linksরাজ্যগুলির সহায়তা পৃষ্ঠা :

আপনি '-লিঙ্কগুলি' সহ নির্দিষ্ট সংখ্যক লিঙ্কযুক্ত ফাইলগুলিও অনুসন্ধান করতে পারেন। ডিরেক্টরিগুলিতে সাধারণত কমপক্ষে দুটি হার্ড লিঙ্ক থাকে; তাদের। প্রবেশ দ্বিতীয় হয়। যদি তাদের উপ-ডিরেক্টরি থাকে তবে তাদের প্রত্যেকের কাছে তার প্যারেন্ট ডিরেক্টরিতে একটি শক্ত লিঙ্ক বলা হয়। দ্য . এবং .. ডিরেক্টরি এন্ট্রিগুলি সাধারণত সন্ধান করা হয় না যতক্ষণ না সেগুলি অনুসন্ধান কমান্ড লাইনে উল্লেখ করা হয়।

সম্ভাব্য সমাধান:

oz123@debian:~/ $ find .  -type d  -links 2
./a/a2
./a/a3
./a/a1
./c
./a1/a31
./a1/a11
./a1/a12
./b/b1/b12
./b/b1/b3
./b/b1/b11/b21/b31
  • যে কেউ আরও ভাল সমাধান সরবরাহ করতে পারে (পাইপ এবং সেড ব্যবহার না করেই এটি পারফরম্যান্ট হয়ে গেছে ...)
  • এটি কোনও ফাইল সিস্টেমে কাজ করবে?

3
আপনি -links 2কৌতুকের চেয়ে আরও পারফরম্যান্স পাবেন না । এটি কাজ করবে না btrfs
স্টাফেন চেজেলাস

উত্তর:


3

এর সাথে আপনার নিজের সমাধানের সংযোজন হিসাবে -linksআমি কেবল যুক্ত করতে চাই যে এটি ইউনিক্স ডিরেক্টরি-লিঙ্ক কনভেনশন অনুসরণ না করে এমন ফাইল সিস্টেমগুলিতে কাজ করবে না। man findঅপশন থেকে -noleafএগুলি হ'ল কমপক্ষে সিডি-রম, এমএস-ডস ফাইল সিস্টেম এবং এএফএস ভলিউম মাউন্ট পয়েন্ট।

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


3

আরও কিছুটা সুস্পষ্ট বিকল্প রয়েছে -empty:

find . -type d -empty

upd। ঠিক আছে, আপনি ঠিক বলেছেন এই পথে ফাইলগুলির সাথে কাজ করবে না।

সুতরাং এখানে এটি একটি স্থির ফাইল সিস্টেমের নির্ভরযোগ্য সংস্করণ:

find dtest/ -type d -exec sh -c "if [ \$(find {} -maxdepth 1 -type d | wc -l) -eq 1 ]; then echo {} ; fi" \;

2
যদি আমি প্রশ্নটি বুঝতে পারি তবে শেষ ডিরেক্টরিগুলিতে ফাইল থাকতে পারে। এটি "ডিরেক্টরি" খালি না হওয়ায় এটি ডিরেক্টরিগুলি মুদ্রণ করবে না ...
স্টিফান

@ রশ, সাবডিয়ারগুলি খালি থাকতে পারে বা না
Oz123

@ ওজ 123 দয়া করে আমার আপডেটটি পরীক্ষা করুন, এটি যথেষ্ট দ্রুত হওয়া উচিত, তবে আপনার পদ্ধতির সাথে তুলনা করা কিছুটা ধীরে ধীরে উচিত।
নলখাগড়া

@ রশ, ধন্যবাদ, তবে পাইপগুলি এড়াতে আমার আসলেই দরকার, তারা জিনিসগুলিকে ধীর করে তুলতে পারে।
Oz123

1

find . -type d -links 2বেশিরভাগ ফাইল সিস্টেমে কাজ করে তবে সবকটি নয়। আমি মনে করি না যে কোন ফাইল সিস্টেমের ধরণের ডিরেক্টরিগুলির নিজস্ব একটি লিঙ্ক রয়েছে সেই সম্পত্তি রয়েছে তা জেনেও অন্য উপায় জানার উপায় নেই। জিএনইউ অনুসন্ধান এটিকে গতিশীলভাবে সনাক্ত করে (যদি এটি "ফাইন্ডের-নোনাফ বিকল্পটি স্বয়ংক্রিয়ভাবে চালু করা" সম্পর্কে কিছু প্রিন্ট করে তবে আপনি জানেন যে আপনার ফাইল সিস্টেমটিতে এই সম্পত্তি নেই)। বেশিরভাগ সাধারণ ফাইল সিস্টেমের ধরণগুলি ঠিক আছে তবে FAT বা বিটিআরএফ নয়।

আপনি যদি নিশ্চিত হতে চান তবে আপনাকে প্রতিটি ডিরেক্টরি পরীক্ষা করতে হবে। এটি করার একটি উপায় হ'ল findপ্রতিটি উপ-ডিরেক্টরিতে আবার আবেদন করা।

find . -type d ! -exec sh -c '
   find "$1/." ! -name . -type d -prune | grep -q "^"' sh {} \; -print

(গনুহ সঙ্গে find, আপনি প্রতিস্থাপন করতে পারেন -pruneসঙ্গে -print -quitএটি একটি বিট আরো কার্যকর করা)।

আর একটি উপায় হ'ল আউটপুট পোস্ট-প্রক্রিয়া করা find। এর সাথে find -depth, একটি পাতলা ডিরেক্টরি এমন একটি যা নিজের একটি উপ-ডিরেক্টরি অনুসরণ করে না।

find . -depth -type d -print0 |
awk -v RS='\0' '
    substr(previous, 1, length($0) + 1) != $0 "/"
    { previous = $0 }
'

0

নিম্নলিখিত সমাধানটি চেষ্টা করুন (লিনাক্স, ইউনিক্স এবং ওএস এক্স সামঞ্জস্যপূর্ণ হওয়া উচিত):

find . -type d -execdir sh -c 'test -z "$(find "{}" -mindepth 1 -type d)" && echo $PWD/{}' ';'

এটি হুড়োহুড়ি সমাধানের অনুরূপ পন্থা , তবে কোনও পাইপ ছাড়াই।

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