लिनक्स में 'चौड़ाई' उपयोगिता का पहला विकल्प?


12

क्या लिनक्स `खोज 'उपयोगिता में कोई चौड़ाई-पहला / गहराई-पहला विकल्प है?

जवाबों:


5

जीएनयू खोजने के लिए कुछ भी नहीं बनाया गया है। आप findस्लैश की संख्या से क्रमबद्ध आउटपुट को पोस्टप्रॉसेस कर सकते हैं , उदाहरण के लिए पर्ल के साथ:

find ... | perl -e 'print sort {$a=~s!/!/! <=> $b=~s!/!/!} <>'
  • <> सभी इनपुट लाइनों की सूची है;
  • $a =~ s!/!/!gस्लैश की संख्या है $a, जिसे हम सॉर्ट मानदंड के रूप में उपयोग करते हैं।

यदि आप zsh का उपयोग कर सकते हैं:

echo **/*(oe\''REPLY=${REPLY//[^\/]}'\')
  • **/* वर्तमान निर्देशिका और उपनिर्देशिकाओं में सभी फाइलों को सूचीबद्ध करता है।
  • कोष्ठक के अंदर सामान एक ग्लोब क्वालिफायर है।
  • ग्लोब क्वालीफ़ायर oeउस क्रम को नियंत्रित करता है जिसमें मैचों को वापस लौटाया जाता है: वे REPLYप्रत्येक मैच के लिए यहां उद्धरणों में कोड चलाने के बाद के मूल्य से क्रमबद्ध होते हैं, REPLYशुरू में मिलान वाले पथ पर सेट होते हैं।
  • कहा गया कोड $REPLYस्लेश को छोड़कर सबकुछ डिलीट कर देता है। इसलिए परिणाम में गहराई 1 पर सब कुछ होता है (परिणामी खाली $REPLY), फिर गहराई 2 पर सब कुछ ( $REPLYसमाप्त होता है /), गहराई 3 ( //), आदि।

1
सॉर्ट पोस्ट प्रक्रिया बहुत दिलचस्प है, हालांकि, सॉर्ट को खोजने की आवश्यकता है, और आपको ब्रेक को नियंत्रित करने का मौका नहीं मिलेगा।
क्ज़िउ जेलेई


1

मेरी भावना यह है कि आप कर सकते हैं। इसमें grep और इस तरह के और एक लूप शामिल हैं, लेकिन मुझे लगता है कि यह बहुत अच्छी तरह से काम करता है, विशेष रूप से आपके मामले के लिए जिसे पूरा करने की आवश्यकता नहीं है।

इसकी वजह से यह अधिक संसाधन गहन है:

  • बहुत सारे फोर्किंग
  • बहुत सारे मिल जाते हैं
  • वर्तमान गहराई से पहले प्रत्येक निर्देशिका को हिट के रूप में कई बार फ़ाइल संरचना में कुल गहराई है (यह एक समस्या नहीं होनी चाहिए यदि आपके पास व्यावहारिक रूप से राम की कोई राशि है ...)

यह अच्छा है क्योंकि:

  • इसमें बैश और बेसिक गन टूल्स का इस्तेमाल किया गया है
  • जब चाहें तब इसे तोड़ा जा सकता है (जैसे आप देखते हैं कि आप उड़ने के लिए क्या देख रहे थे)
  • यह प्रति पंक्ति और प्रति खोज के रूप में काम करता है, इसलिए बाद के आदेशों में एक खोज और एक प्रकार की प्रतीक्षा नहीं करनी होती है
  • यह वास्तविक फाइल सिस्टम सेपरेशन के आधार पर काम करता है, इसलिए यदि आपके पास इसमें एक स्लैश के साथ एक निर्देशिका है, तो यह उससे अधिक गहरा सूचीबद्ध नहीं होगा; यदि आपके पास एक अलग पथ विभाजक कॉन्फ़िगर है, तो आप अभी भी ठीक हैं।
#! / Bin / bash 
गहराई = 0

जबकि मिल -mindepth $ गहराई -maxdepth $ गहराई | grep '।'
कर
    गहराई = $ ((गहराई + 1))
किया हुआ

आप इसे आसानी से एक पंक्ति में भी फिट कर सकते हैं (?) आसानी से:

depth=0; while find -mindepth $depth -maxdepth $depth | grep --color=never '.'; do depth=$((depth + 1)); done

लेकिन मैं टाइपिंग से ज्यादा छोटी स्क्रिप्ट पसंद करता हूं ...

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