Perché GNU trova così velocemente rispetto alle utility di ricerca di file grafici?


47

Sto cercando di trovare un file che non esiste nella mia directory home e in tutte le sottodirectory.

find ~/ -name "bogus"mi dà queste informazioni dopo pochi secondi, ma il dolphinfile manager di KDE ha impiegato quasi 3 minuti per fare lo stesso. Ciò corrisponde alla mia precedente esperienza con GNOMEbeagle .

In che modo findriesce a fare lo stesso molto velocemente mentre la ricerca grafica (che è più intuitiva da usare rispetto ai parametri della riga di comando) è alle spalle?


Non so cosa sia "Dolphin", ma forse guarda anche all'interno dei file?
Kusalananda

1
È un file manager grafico di KDE: kde.org/applications/system/dolphin Ha la capacità di cercare nei file, ma non ho abilitato quell'opzione durante questo breve test.
Red

9
Hai cercato più di una volta in Delfino? Potrebbe essere "indicizzazione" la prima volta. E "trovare" è anche lento. Prova a "individuare" se il file è precedente all'ultima indicizzazione del database per individuare ;-)
Rinzwind

Uso locatepiù spesso di finded è più veloce in una grande cartella
phuclv

11
mentre locateè davvero ottimo per trovare i file, questo è un po 'OT, perché utilizza un approccio completamente diverso: finde strumenti della GUI come Dolphinstanno attraversando l'albero dei file su richiesta, mentre locateutilizza una struttura di indice creata in precedenza.
Michael Schaefers,

Risposte:


68

Guardando Dolphin con Baloo in particolare, sembra cercare i metadati di ogni file nel suo dominio di ricerca, anche se stai facendo una semplice ricerca per nome di file. Quando seguo il file.soprocesso, vedo le chiamate a lstat, getxattre getxattrancora per ogni file, e anche per le ..voci. Queste chiamate di sistema recuperano i metadati sul file che è archiviato in una posizione diversa dal nome del file (il nome del file è memorizzato nel contenuto della directory, ma i metadati sono nell'inode ). L'interrogazione dei metadati di un file più volte è economica poiché i dati si troverebbero nella cache del disco, ma può esserci una differenza significativa tra l'interrogazione dei metadati e non l'interrogazione dei metadati.

findè molto più intelligente. Cerca di evitare chiamate di sistema non necessarie. Non chiamerà getxattrperché non cerca in base ad attributi estesi. Quando attraversa una directory, potrebbe essere necessario chiamare lstatnomi di file non corrispondenti perché potrebbe essere una sottodirectory per la ricerca ricorsiva ( lstatè la chiamata di sistema che restituisce i metadati del file incluso il tipo di file come regular / directory / symlink / ...). Tuttavia findha un'ottimizzazione: sa quante sottodirectory ha una directory dal suo conteggio dei collegamenti e smette di chiamare lstatquando sa che ha attraversato tutte le sottodirectory. In particolare, in una directory leaf (una directory senza sottodirectory),findcontrolla solo i nomi, non i metadati. Inoltre alcuni filesystem mantengono una copia del tipo di file nella voce della directory in modo che findnon sia nemmeno necessario chiamare lstatse questa è l'unica informazione di cui ha bisogno.

Se esegui findcon opzioni che richiedono il controllo dei metadati, effettuerà più lstatchiamate, ma non effettuerà comunque una lstatchiamata su un file se non ha bisogno delle informazioni (ad esempio perché il file è escluso da una condizione precedente corrispondendo al nome).

Sospetto che altri strumenti di ricerca della GUI che reinventano la findruota siano allo stesso modo meno intelligenti dell'utilità della riga di comando che ha subito decenni di ottimizzazione. Dolphin, almeno, è abbastanza intelligente da utilizzare il database di localizzazione se si cerca "ovunque" (con la limitazione che non è chiara nell'interfaccia utente che i risultati potrebbero non essere aggiornati).


22
GNU find è così "intelligente" che manca alcuni file su alcuni tipi di filesystem. Il noto bug di GNU rileva che rende illegale il presupposto che il conteggio dei collegamenti di una directory sia 2 + number of sub-directories.Questo funziona per i filesystem che implementano il bug di progettazione dal filesystem UNIX V7, ma non per tutti i filesystem, poiché questo non è un requisito POSIX . Se ti piace ottenere un numero di prestazione utile per GNU make, devi specificare per indicare -noleafa GNU make come si comportano correttamente.
schily

12
@schily, GNU findpotrebbe aver avuto quel bug molto tempo fa, ma dubito che troverai un caso in cui è necessario specificare -noleafa mano al giorno d'oggi. AFAICT, almeno su Linux getdents()(e readdir ()) dice quali file sono file di directory su UDF, ISO-9660, btrfs che non hanno reali .o ..voci e findsi comporta bene lì. Conosci un caso in cui GNU findpresenta il problema?
Stéphane Chazelas,

4
Basta usare questo genisoimage marcio di debian per creare un filesystem Rock Ridge usando "innesti punti" e il conteggio dei collegamenti in una directory è un valore casuale. Poiché Rock Ridge implementa un conteggio dei collegamenti e. / .., GNU find di solito non trova tutti i file su un tale filesystem.
schily

4
@ StéphaneChazelas: L'ultima volta che ho verificato (per la tesi del mio maestro), il bug è stato risolto affermando esattamente 2 significati foglia nota anziché <= 2. I filesystem che non implementano il contatore 2+ restituiscono tutti 1 per il conteggio dei collegamenti alla directory, quindi va tutto bene. Ora, se un giorno qualcuno creasse un filesystem con collegamenti diretti a directory che non avevano questa proprietà, qualcuno avrebbe avuto una brutta giornata.
Giosuè,

15
@schily, non sono stato in grado di ottenere conteggi di collegamenti casuali con innesti punti e RR con genisoimage 1.1.11 su Debian e anche se modifico binariamente l'immagine iso per cambiare il conteggio dei collegamenti in valori casuali, non vedo ancora alcun problema con GNU find. E in ogni caso, strace -vmostra che getdents()restituisce correttamente d_type = DT_DIR per le directory, quindi GNU find non deve usare il trucco del conteggio dei collegamenti.
Stéphane Chazelas,
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.