2009-07-06 5 views
27

कभी-कभी मुझे पता है कि एक फ़ाइल इतनी गहरी नहीं है, लेकिन एक बहुत घनी उप-निर्देशिका मुझे उन फ़ाइलों को ढूंढने की अनुमति नहीं देती है जिन्हें मैं आसानी से चाहता हूं।फ़ाइलों को चौड़ाई के लिए 'ढूंढ' या कोई अन्य उपकरण खोज सकता है?

find (या कोई अन्य उपकरण) चौड़ाई-पहली खोज का उपयोग कर फ़ाइलों के लिए देख सकते हैं?

+1

यदि आप अभी भी ऐसी चीज़ ढूंढ रहे हैं, तो मैंने [यह] (https://github.com/tavianator/bfs) –

+0

लिखा है और ** ढूंढें ** कमांड के "prune" विकल्प को मास्टर करें तुम उस पर हो जब आप ऑब्जेक्ट - फ़ाइल या निर्देशिका - जिसे आप ढूंढ रहे हैं, वहां कुछ गहराई से, अत्यधिक आबादी वाली निर्देशिका subtree की कुछ गहराई-पहली रिकर्सिव खोज में फंसने में कोई समझ नहीं है। –

उत्तर

16

हां, तरह।

आप -depth विकल्प का उपयोग कर सकते हैं ताकि यह निर्देशिका से पहले किसी निर्देशिका की सामग्री को संसाधित कर सके। आप -maxdepth विकल्प का उपयोग भी सीमित कर सकते हैं ताकि यह निर्धारित किया जा सके कि कितनी निर्देशिकाएं ड्रिल करेंगी।

+2

"प्रकार का" सही है - यह अभी भी वास्तविक चौड़ाई नहीं है- पहली खोज, क्योंकि ए/बी/सी से पहले/बी/सी का दौरा किया जाएगा। हालांकि, अधिकांश उद्देश्यों के लिए पर्याप्त है। – ephemient

+1

यह अभी भी चौड़ाई पहली खोज नहीं है। यह केवल पहली गहराई की गहराई है।सीमित गहराई पहली खोज "फ़ाइल [वह] इतनी गहरी दूर नहीं है" खोजने की समस्या को हल करती है, लेकिन फिर भी यह निश्चित रूप से चौड़ाई पहली खोज नहीं है। – yiati

4

विकल्प के साथका उपयोग करें।

यह आपके संदर्भ पृष्ठ में Directories अनुभाग पर है; आपकी आवश्यकताओं के आधार पर अन्य विकल्प अधिक उपयुक्त हो सकते हैं।

सटीक चौड़ाई पहली खोज प्राप्त करने के लिए, आपको मिश्रित --mindepth और --maxdepth विकल्पों के साथ लूप की आवश्यकता होगी। लेकिन, मुझे नहीं लगता कि यह सटीक होना जरूरी है, गहराई से सीमित खोज आम तौर पर पर्याप्त होगी।

7

भयानक हैक, -0 या -print, अक्षम, आदि आदि के अलावा अन्य किसी भी कार्रवाई के साथ काम नहीं करेगा ...

#!/bin/bash 
i=0 
while results=$(find -mindepth $i -maxdepth $i "[email protected]") && [[ -n $results ]]; do 
    echo "$results" 
    ((i++)) 
done 

असल में यह सिर्फ

find -mindepth 0 -maxdepth 0 
find -mindepth 1 -maxdepth 1 
find -mindepth 2 -maxdepth 2 
………………………………………………………………………… 

find जब तक रिटर्न गैर शून्य चलाता है स्थिति या प्रिंट कुछ भी नहीं।

+3

मुझे लगता है कि [पुनरावृत्ति गहराई-पहली खोज] (http://en.wikipedia.org/wiki/Iterative_deepening_depth-first_search) मुझे ... –

+1

@MattLuongo: आपके लिंक से: "आईडीडीएफएस चौड़ाई-पहली खोज के बराबर है, लेकिन बहुत कम स्मृति का उपयोग करता है; " –

+1

@MooingDuck मैं इस बात से असहमत नहीं था कि यह काम करता है, बस यह इंगित करता है कि इसका एक विशिष्ट नाम है। आईडीएफएस बीएफएस की तुलना में धीमी है, क्योंकि इसे हर बार पेड़ पर पूर्व स्तर को फिर से चलाने की आवश्यकता होती है। मैंने जो तर्क सुना है वह यह है कि अधिकांश खोज समस्याओं में, उस रनटाइम लागत को 'एन + 1' ट्रैवर्सिंग की लागत का प्रभुत्व है, इसलिए यह अक्सर सार्थक होता है। –

5

एक चौड़ाई पहले अपनी कतार के रूप में चर का उपयोग कर पाते हैं।

bfs.sh

#!/bin/bash 

queue="$1" 
shift 

while [ -n "$queue" ] 
do 
    echo "$queue" | xargs -I'{}' find {} -mindepth 1 -maxdepth 1 $* 
    queue=`echo "$queue" | xargs -I'{}' find {} -mindepth 1 -maxdepth 1 -type d` 
done 

यह निष्पादन योग्य बनाने बनाएँ:

$ chmod u+x ./bfs.sh

तो फिर तुम एक कर सकते हैं चौड़ाई-पहले खोजने के द्वारा:

$ ./bfs.sh /path/to/somewhere -name foobar

0
find . | awk '{FS = "/" ; print "", NF, $F}' | sort -n | awk '{print $2}' | xargs grep -d skip "search term" 

यह सभी फ़ाइलों को सूचीबद्ध करने के लिए उपयोग करता है। पहला awk कमांड सभी '/' अक्षरों की गणना करता है। यह गिनती पर आधारित है और फिर गिनती कॉलम छोड़ देता है। अंत में यह फ़ाइलों की क्रमबद्ध सूची grep करने के लिए xargs का उपयोग करता है।

यह वास्तव में बदसूरत है।

संबंधित मुद्दे