एक पेड़ में सभी अंत उपनिर्देशिका खोजें


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
  • किसी को भी एक बेहतर समाधान प्रदान कर सकते हैं (पाइप और sed का उपयोग किए बिना, यह प्रदर्शन किया गया है ...)
  • यह किसी भी फाइल सिस्टम पर काम करेगा?

3
आपको -links 2चाल से अधिक प्रदर्शन करने वाला नहीं मिलेगा । यह काम नहीं करेगा btrfs
स्टीफन चेज़लस

जवाबों:


3

अपने स्वयं के समाधान के साथ -links, मैं केवल यह जोड़ना चाहता हूं कि यह उन फ़ाइल सिस्टम पर काम नहीं करेगा जो यूनिक्स निर्देशिका-लिंक सम्मेलन का पालन नहीं करते हैं। से man findविकल्प पर -noleafइन कम से कम सीडी-रोम में हैं, MS-DOS फ़ाइल सिस्टम और एएफएस मात्रा माउंट पॉइंट।

एक संदर्भ के लिए, इस सवाल पर पहले से ही अलग-अलग समाधानों के साथ चर्चा की गई थी जो वास्तव में धीमी हैं और आमतौर पर पाइपिंग के लिए sed / awk और इसी तरह का सहारा लेते हैं।


3

थोड़ा और स्पष्ट विकल्प है -empty:

find . -type d -empty

युपीडी। ठीक है, तुम सही हो इस तरह से dirs में फ़ाइलों के साथ काम नहीं करेंगे।

तो यहाँ यह एक निश्चित फाइल सिस्टम है जो भरोसेमंद संस्करण है:

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

2
यदि मैं इस प्रश्न को समझता हूं, तो अंतिम निर्देशिका में फाइलें हो सकती हैं। यह उन निर्देशिकाओं को प्रिंट नहीं करेगा क्योंकि वे "खाली" नहीं होंगे ...
स्टीफन

@rush, subdirs खाली हो सकते हैं या नहीं
Oz123

@ Oz123 कृपया मेरे अपडेट की जांच करें, यह काफी तेज़ होना चाहिए, लेकिन आपके रास्ते की तुलना में थोड़ा धीमा।
भीड़

@ धन्यवाद, धन्यवाद, लेकिन मुझे वास्तव में पाइप से बचने की जरूरत है, वे चीजों को धीमा कर सकते हैं।
Oz123

1

find . -type d -links 2अधिकांश filesystem पर काम करता है, लेकिन सभी नहीं। मुझे नहीं लगता कि यह जानने का तरीका है कि फाइलसिस्टम के प्रकारों के अलावा अन्य संपत्ति है कि निर्देशिकाओं में स्वयं के लिए एक लिंक है। GNU इसे गतिशील रूप से पता लगाता है (यदि यह "स्वत: खोज के -noleaf विकल्प को चालू करने" के बारे में कुछ प्रिंट करता है, तो आप जानते हैं कि आपके फाइल सिस्टम में यह गुण नहीं है)। अधिकांश सामान्य फाइलसिस्टम प्रकार ठीक हैं, लेकिन FAT या btrfs नहीं हैं।

यदि आप निश्चित होना चाहते हैं, तो आपको प्रत्येक निर्देशिका का परीक्षण करना होगा। ऐसा करने का एक तरीका findप्रत्येक उपनिर्देशिका के लिए फिर से आह्वान करना है।

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

(जीएनयू साथ find, आप बदल सकते हैं -pruneके साथ -print -quitयह थोड़ा और अधिक कुशल बनाने के लिए)।

एक और तरीका है के उत्पादन के बाद की प्रक्रिया है findfind -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/{}' ';'

यह भीड़ समाधान के लिए समान है , लेकिन बिना किसी पाइप के।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.