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 dolphin
fichiers 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 find
pour 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?
find
performance
dolphin
rouge
la source
la source
locate
plus souvent quefind
et c'est plus rapide dans un énorme dossierlocate
c’est vraiment bien pour la recherche de fichiers, c’est un peu OT, car il utilise une approche complètement différente: lesfind
outils graphiques comme ceuxDolphin
qui traversent l’arborescence de fichiers à la demandelocate
utilisent une structure d’index créée précédemment.Réponses:
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.so
processus, je vois des appels àlstat
,getxattr
etgetxattr
encore 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.find
est beaucoup plus intelligent. Il essaie d'éviter les appels système inutiles. Il n'appelle pasgetxattr
car il ne recherche pas en fonction d'attributs étendus. Lorsqu'il traverse un répertoire, il peut être nécessaire d'appelerlstat
des noms de fichiers ne correspondant pas car il peut s'agir d'un sous-répertoire dans lequel effectuer une recherche récursive (lstat
c'est l'appel système qui renvoie les métadonnées du fichier, y compris le type de fichier, tel que / directory / symlink /…). Cependant, ilfind
a une optimisation: il sait combien de sous-répertoires un répertoire a de son nombre de liens et il arrête d'appelerlstat
dè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),find
vé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 quifind
évite même d’appelerlstat
si c’est la seule information dont il a besoin.Si vous utilisez
find
des options nécessitant une vérification des métadonnées, leslstat
appels seront plus nombreux , mais aucunlstat
appel 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
find
roue 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).la source
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-noleaf
sur ordre d'indiquer à GNU de se comporter correctement.find
peut-ê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 moinsgetdents()
(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 etfind
se comportent bien ici. Connaissez-vous un cas où GNUfind
pose le problème?find
. Et dans tous les cas,strace -v
montre quegetdents()
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.