Pourquoi GNU trouve-t-il si rapidement par rapport aux utilitaires de recherche de fichiers graphiques?

47

J'essaie de trouver un fichier qui n'existe pas dans mon répertoire personnel et dans tous les sous-répertoires.

find ~/ -name "bogus"me donne cette information après quelques secondes, mais le gestionnaire de dolphinfichiers de KDE avait besoin de presque 3 minutes pour faire de même. Cela correspond à mon expérience précédente avec GNOMEbeagle .

Comment fait-on findpour faire la même chose très rapidement alors que la recherche graphique (qui est plus intuitive à utiliser que les paramètres de ligne de commande) traîne derrière?

rouge
la source
Je ne sais pas ce que "Dolphin" est, mais peut-être qu'il regarde aussi à l' intérieur des fichiers?
Kusalananda
1
C'est un gestionnaire de fichiers graphique de KDE: kde.org/applications/system/dolphin Il est capable de chercher dans des fichiers, mais je n'ai pas activé cette option lors de ce court test.
Rouge
9
Avez-vous cherché plus d'une fois dans dauphin? Ce pourrait être "indexer" la 1ère fois. Et "trouver" est lent aussi. Essayez "localiser" si le fichier est plus ancien que la dernière fois que la base de données pour localiser a été indexée ;-)
Rinzwind
J'utilise locateplus souvent que findet c'est plus rapide dans un énorme dossier
phuclv
11
Alors que locatec’est vraiment bien pour la recherche de fichiers, c’est un peu OT, car il utilise une approche complètement différente: les findoutils graphiques comme ceux Dolphinqui traversent l’arborescence de fichiers à la demande locateutilisent une structure d’index créée précédemment.
Michael Schaefers

Réponses:

68

En regardant spécifiquement Dolphin avec Baloo, il semble rechercher les métadonnées de chaque fichier de son domaine de recherche, même si vous effectuez une recherche simple de nom de fichier. Lorsque je trace le file.soprocessus, je vois des appels à lstat, getxattret getxattrencore pour chaque fichier, et même pour des ..entrées. Ces appels système récupèrent des métadonnées sur le fichier qui sont stockées à un emplacement différent du nom de fichier (le nom de fichier est stocké dans le contenu du répertoire, mais les métadonnées sont dans l' inode ). Interroger les métadonnées d'un fichier à plusieurs reprises est peu coûteux, car les données se trouvent dans le cache du disque, mais il peut y avoir une différence significative entre interroger les métadonnées et ne pas les interroger.

findest beaucoup plus intelligent. Il essaie d'éviter les appels système inutiles. Il n'appelle pas getxattrcar il ne recherche pas en fonction d'attributs étendus. Lorsqu'il traverse un répertoire, il peut être nécessaire d'appeler lstatdes noms de fichiers ne correspondant pas car il peut s'agir d'un sous-répertoire dans lequel effectuer une recherche récursive ( lstatc'est l'appel système qui renvoie les métadonnées du fichier, y compris le type de fichier, tel que / directory / symlink /…). Cependant, il finda une optimisation: il sait combien de sous-répertoires un répertoire a de son nombre de liens et il arrête d'appeler lstatdès qu'il sait qu'il a parcouru tous les sous-répertoires. En particulier, dans un répertoire feuille (un répertoire sans sous-répertoires),findvérifie seulement les noms, pas les métadonnées. De plus, certains systèmes de fichiers conservent une copie du type de fichier dans l’entrée du répertoire, ce qui findévite même d’appeler lstatsi c’est la seule information dont il a besoin.

Si vous utilisez finddes options nécessitant une vérification des métadonnées, les lstatappels seront plus nombreux , mais aucun lstatappel ne sera toujours effectué sur un fichier s'il n'a pas besoin des informations (par exemple, le fichier est exclu par une condition antérieure. correspondant sur le nom).

Je suppose que les autres outils de recherche d'interface graphique qui réinventent la findroue sont également moins intelligents que l'utilitaire de ligne de commande, qui a subi des décennies d'optimisation. Dolphin, du moins, est suffisamment intelligent pour utiliser la base de données de localisation si vous effectuez une recherche «partout» (avec la limitation qui n’est pas claire dans l’UI que les résultats risquent d’être obsolètes).

Gilles, arrête de faire le mal
la source
22
GNU find est si "malin" qu'il manque des fichiers sur certains types de systèmes de fichiers. Le bogue bien connu dans la recherche GNU est qu’il présume illégalement que le nombre de liens d’un répertoire est 2 + number of sub-directories.Ceci fonctionne pour les systèmes de fichiers qui implémentent le bogue de conception du système de fichiers UNIX V7, mais pas pour tous les systèmes de fichiers, car ce n’est pas une exigence POSIX. . Si vous souhaitez obtenir un numéro de performance utile pour GNU make, vous devez spécifier -noleafsur ordre d'indiquer à GNU de se comporter correctement.
Schily
12
@schily, GNU a findpeut-être eu ce bogue il y a longtemps, mais je doute que vous trouviez un cas où vous devez spécifier -noleafà la main de nos jours. AFAICT, sur Linux au moins getdents()(et readdir ()) indique quels fichiers sont des fichiers de répertoires sur UDF, ISO-9660, btrfs qui ne contiennent pas de données réelles .ou ..entrées et findse comportent bien ici. Connaissez-vous un cas où GNU findpose le problème?
Stéphane Chazelas
4
Utilisez simplement cette image pourrie générée par debian pour créer un système de fichiers Rock Ridge en utilisant des "points de greffe" et le nombre de liens dans un répertoire est une valeur aléatoire. Etant donné que Rock Ridge implémente un nombre de liens et. / .., GNU find ne trouvera généralement pas tous les fichiers sur un tel système de fichiers.
Schily
4
@ StéphaneChazelas: La dernière fois que j'ai vérifié (pour ma thèse de maîtrise), le bogue a été corrigé en affirmant que exactement 2 signifie feuille connue plutôt que <= 2. Les systèmes de fichiers qui ne mettent pas en œuvre le compteur 2+ renvoient tous 1 pour le nombre de liens de répertoires, tout est bien. Maintenant, si un jour, quelqu'un a créé un système de fichiers qui a établi des liens solides vers des répertoires ne possédant pas cette propriété, quelqu'un passera une mauvaise journée.
Josué
15
@schily, je n'ai pas pu obtenir de nombres de liens aléatoires avec des points de greffe et un RR avec genisoimage 1.1.11 sur Debian, et même si j'édite binaire l'image iso pour changer le nombre de liens en valeurs aléatoires, je ne vois toujours pas problème avec GNU find. Et dans tous les cas, strace -vmontre que getdents()renvoie correctement d_type = DT_DIR pour les répertoires, de sorte que GNU find n’a pas à utiliser le truc du nombre de liens.
Stéphane Chazelas