2009-07-06 4 views
27

A volte so che un file non è così profondo, ma una sottodirectory molto densa non mi permette di trovare facilmente i file che voglio.Può 'trovare' o qualsiasi altro strumento cercare i file in ampiezza?

Può find (o qualsiasi altro strumento) cercare i file utilizzando la ricerca in larghezza?

+1

Nel caso in cui stiate ancora cercando una cosa del genere, ho scritto [questo] (https://github.com/tavianator/bfs) –

+0

E padroneggiare l'opzione "prune" del comando ** find ** mentre ci sei. Non ha senso essere impantanati in una ricerca ricorsiva di profondità di una sottostruttura di directory molto popolata e altamente popolata quando si conosce l'oggetto - file o directory - che si sta cercando non c'è. –

risposta

16

Sì, una specie di.

È possibile utilizzare l'opzione -depth per elaborare i contenuti di una directory prima della directory stessa. È inoltre possibile utilizzare l'opzione -maxdepth per limitare il numero di directory che eseguirà il drill.

+2

"sort of" ha ragione - questa non è ancora una vera ricerca in ampiezza, dal momento che a/b/c sarà visitato prima di a/d. Abbastanza buono per la maggior parte degli scopi, però. – ephemient

+1

Questa non è ancora la prima ricerca. Questa è solo la prima ricerca di profondità limitata.La prima ricerca a profondità limitata risolve il problema di trovare "un file [che] non è così profondo", ma ciò nonostante non è sicuramente una ricerca per ampiezza. – yiati

4

Utilizzare find con l'opzione --maxdepth.

Questo è nella sezione Directories nella pagina di riferimento; potrebbe trovare altre opzioni più adatte a seconda delle esigenze.

Per ottenere la larghezza esatta per prima ricerca, è necessario eseguire il ciclo con le opzioni miste --mindepth e --maxdepth. Ma, non credo sia necessario essere così esatti, una ricerca limitata in profondità di solito è sufficiente.

7

mod orribile, non funziona con -0 o qualsiasi azioni diverse -print, inefficiente, ecc ecc ...

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

Fondamentalmente questo solo corre

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

fino find rendimenti non-zero stato o stampa nulla.

+3

Sembra [ricerca iterativa in profondità] (http://en.wikipedia.org/wiki/Iterative_deepening_depth-first_search) per me ... –

+1

@MattLuongo: Dal tuo link: "IDDFS è equivalente alla ricerca in ampiezza, ma usa molta meno memoria; " –

+1

@MooingDuck Non ero in disaccordo sul fatto che questo funziona, solo sottolineando che ha un nome specifico. IDFS è anche più lento di BFS, poiché richiede ogni volta il re-attraversamento del livello precedente sull'albero. L'argomento che ho sentito è che nella maggior parte dei problemi di ricerca, il costo di esecuzione è dominato dal costo di attraversamento di 'n + 1', quindi è spesso utile. –

5

Una ricerca di ampiezza utilizzando la variabile come coda.

Creare 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 

Renderlo eseguibile:

$ chmod u+x ./bfs.sh

allora si può fare un breadth-first Cerca per:

$ ./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" 

Usa trova per elencare tutti i file. Il primo comando awk conta tutti i caratteri '/'. Ordina il conteggio e quindi rilascia la colonna count. Infine usa xargs per annullare l'elenco ordinato di file.

È davvero brutto.