opzione breadth-first nell'utilità `find 'di Linux?


12

Esiste un'opzione breadth-first / depth-first nell'utility `find 'di Linux?

Risposte:


5

Non c'è nulla di incorporato da trovare, anche GNU trova. È possibile postelaborare l'output di findordinare in base al numero di barre, ad esempio con Perl:

find ... | perl -e 'print sort {$a=~s!/!/! <=> $b=~s!/!/!} <>'
  • <> è l'elenco di tutte le righe di input;
  • $a =~ s!/!/!gè il numero di barre $a, che usiamo come criterio di ordinamento.

Se puoi usare zsh:

echo **/*(oe\''REPLY=${REPLY//[^\/]}'\')
  • **/* elenca tutti i file nella directory corrente e nelle sottodirectory.
  • Il materiale tra parentesi è un qualificatore glob.
  • Il qualificatore glob oecontrolla l'ordine in cui vengono restituite le corrispondenze: vengono ordinate in base al valore di REPLYdopo aver eseguito il codice qui tra virgolette per ogni corrispondenza con REPLYinizialmente impostato sul percorso corrispondente.
  • Detto codice si trasforma $REPLYper eliminare tutto tranne le barre. Quindi il risultato è costituito da tutto alla profondità 1 (risultante vuoto $REPLY), quindi tutto alla profondità 2 ( $REPLYfinisce per essere /), profondità 3 ( //), ecc.

1
Il processo di ordinamento della posta è molto interessante, tuttavia, l'ordinamento richiede che la ricerca sia completata e non avrai la possibilità di controllare l'interruzione.
Xiè Jìléi,


1

La mia sensazione è che puoi. Implica grep e simili e un ciclo, ma trovo che funzioni molto bene, in particolare per il tuo caso sulla ricerca che non necessita di essere completata.

Richiede più risorse a causa di:

  • Un sacco di biforcazioni
  • Molti reperti
  • Ogni directory prima della profondità attuale viene colpita da find tutte le volte che c'è profondità totale nella struttura del file (questo non dovrebbe essere un problema se hai praticamente qualsiasi quantità di ram ...)

Questo va bene perché:

  • Usa strumenti bash e gnu di base
  • Può essere rotto ogni volta che vuoi (come vedi quello che stavi cercando vola vicino)
  • Funziona per riga e non per ricerca, quindi i comandi successivi non devono attendere la ricerca e l'ordinamento
  • Funziona in base alla separazione effettiva del file system, quindi se si dispone di una directory con una barra, non verrà elencata più in profondità di quanto non sia; se hai configurato un separatore di percorso diverso, stai ancora bene.
#! / Bin / bash 
profondità = 0

mentre trova -mindepth $ depth -maxdepth $ depth | grep "."
fare
    profondità = $ ((profondità + 1))
fatto

Puoi anche inserirlo in una riga abbastanza (?) Facilmente:

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

Ma preferisco piccoli script rispetto alla digitazione ...

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.