简体中文
Un indexeur et chercheur de système de fichiers multiplateforme combinant les avantages de find
, locate
et Everything
, ainsi que des recherches de contenu de fichier. Fonctionne sous Linux, macOS et Windows.
L'index inversé, la technologie derrière plocate
qui effectue des recherches en temps quasi constant, est implémenté dans v0.4.0
et supérieure . Malheureusement, v0.4
n'a pas été bien testée et la version est actuellement v0.3.x
De plus, toutes les démonstrations du README sont effectuées sur v0.3.0
. Pour les ordinateurs personnels qui contiennent généralement moins de 3 millions de fichiers, l'index inversé ne fait cependant pas beaucoup de différence.
Les recherches de contenu ne sont pas indexées. L'indexation du contenu des fichiers d'indexation sera travaillée si ce dépôt atteint 512 étoiles, alors écrasez ce bouton étoile si l'application s'avère utile pour vous ou si vous la trouvez intéressante !
(Plus d'informations à ce sujet ici.)
Ce README concerne l'application CLI. Pour l’interface graphique, voir SearchEverywhere. (aussi assez instable)
Ce projet a commencé à être travaillé depuis août 2022, mais n'a été publié qu'en avril 2023 en raison d'innombrables bugs. Il peut encore y avoir d'innombrables bugs actuellement, même sur la version stable ( v0.3.x
).
La seule dépendance d'exécution est PCRE2, et un exécutable entièrement statique ne fait que 2,5 Mo (dépouillé).
Le premier indexeur de fichiers Libre sur macOS et Windows !?
/System/Volumes/Data
que les astuces find
Capture d'écran sur macOS et Windows respectivement :
updatedb
multithread non root (SSD uniquement) Contrairement à locate
, la reconstruction de l'index du système de fichiers ne nécessite AUCUNE autorisation root (ou Administrateur sous Windows). Pas de setugid non plus.
Pour les SSD, un pool de threads est configuré pour les lectures simultanées de répertoires, accélérant considérablement la vitesse de lecture.
Pour les disques durs, cette fonctionnalité doit être désactivée, car les E/S multithread n'apportent aucun gain de performances visible en raison de leur nature tournante.
L'activation updatedb
multithread peut être activée par chemin.
La figure montre qu'Orient peut analyser 810 000 fichiers en 1 seconde avec suppression du cache , mais le orient
utilisé est plutôt haut de gamme. Prenez-le avec un grain de sel cependant.
Comme updatedb
, le même pool de threads est également utilisé pour la correspondance de contenu. La correspondance floue hello world
à partir de l'arborescence source du noyau Linux de 75 000 fichiers a pris 5,5 secondes lorsque le cache a été supprimé et 1,5 seconde avec le cache.
(à prendre avec précaution : 16x Intel i7 11800H et SSD NVMe)
Sous Windows, la correspondance de contenu est nettement plus lente , un effet combiné de la conversion UTF8 en UTF16, du manque de mappage efficace de la mémoire du noyau (
mmap(2)
) et de la nature gonflée et inefficace de Windows.
Au revoir find ... | xargs grep ...
et find ... -a -exec grep ...
find
Comme indiqué ci-dessous, orient
implémente également de grandes parties des correspondances de find
, permettant aux utilisateurs de se familiariser facilement avec l'expérience existante en matière d'utilisation find
tout en augmentant la polyvalence de l'application.
Contrairement à Everything
dont le parent codé en dur correspond uniquement à la correspondance de chaîne, dans orient
, -updir -downdir
peut être appliqué à n'importe quel prédicat.
De plus, -downdir
a une surcharge de presque 0 et -updir
rend les recherches encore plus rapides en mettant en cache les correspondances récentes.
Parent correspondant :
Enfants correspondants :
Linux | Fenêtres | macOS | Androïde | Licence | |
---|---|---|---|---|---|
Everything | ?NON | ?OUI | ?NON | ?NON | Propriétaire |
find | ?OUI | ?NON | ?NON | ?NON | GPLv3 |
fsearch | ?OUI | ?NON | ?NON | ?NON | GPLv2 |
locate | ?OUI | ?NON | ?NON | ?NON | GPLv3 |
orient | ?OUI | ?OUI | ?OUI | ?NON | GPLv3 |
Suite du tableau
-and -or | Inverser l'index | Faire correspondre le parent | Interface graphique | CLI | |
---|---|---|---|---|---|
Everything | ?OUI | ?NON | Partiel | ?OUI | ? |
find | ?OUI | ?NON | ?NON | ?NON | ?OUI |
fsearch | ?OUI | ?NON | Partiel | ?OUI | ?NON |
locate | ?NON | ?OUI | ?NON | ?NON | ?OUI |
orient | ?OUI | ?OUI | ?OUI | ?OUI | ?OUI |
Remarques :
Everything
CLI semble avoir tous les résultats embellis , ce qui le rend très difficile à utiliser en combinaison avec d'autres outils, d'où le ? affronter.eVeRyThInG
, SEUL LE SDK FOURNI !!! NOTRE CHER LEADER RICHARD STALLMAN VA LE NUTRISER !!!Ce qui est pire,
Everything SDK
est rempli d'états globaux.
find
Les utilisateurs familiers avec find
pourraient démarrer avec les prédicats compatibles find
d' orient
, comme -regex
, -lname
, -okdir
et autres.
Notez que les prédicats orient
sont parfois un surensemble de leurs homologues find
, comme -quit
accepte éventuellement un argument entier signifiant combien de résultats peuvent être produits avant de quitter. Sa valeur par défaut est 1, de sorte que lors de l'utilisation -quit
sans argument, elle n'a aucune différence par rapport à celle de find
.
Pour les prédicats spécifiques à orient
, seule la syntaxe de style orient
est fournie, voir ci-dessous.
# mp3 or mp4 file excluding under hidden dirs
find ~ ( -name " .* " -a -prune -a -false ) -o -name " *.mp[34] "
orient ~ ( -name " .* " -a -prune -a -false ) -o -name " *.mp[34] "
# Ask user to whether to show its realpath when a symlink found in /usr
# until user inputs "yes" (realpath executes)
find /usr -type l -a -okdir realpath {} ; -a -quit
orient /usr -type l -a -okdir realpath {} ; -a -quit
# Until 2 user inputs "yes"
orient /usr -type l -a -okdir realpath {} ; -a -quit 2
# Even better, -quitmod
orient /usr -quitmod ( -type l -a -okdir realpath {} ; )
# -quit -quitmod has some quirks; see docs/predicates.md
orient
orient
n'a pas autant de prédicats (uniques) que find
. Au lieu de cela, orient
vers la syntaxe -PRED --ARG
, donnant plusieurs schémas de correspondance à un seul prédicat, améliorant ainsi la réutilisation du code.
-name
-bregex
-strstr
-fuzz
--ignore-case
(sauf -fuzz
) --full
--readlink
-content-{strstr,fuzz,regex}
--ignore-case
(sauf fuzz) --blocked
--allow-binary
-size
-{a,m,c}{time,min}
-inum
+
ou -
Beaucoup find
que les prédicats compatibles sont en réalité des alias, comme
-lname
est identique à -name --readlink
-regex
- -bregex --ignore-case
(le b
représente le nom de base)
-samefile
est essentiellement -inode
puisque -inode
accepte également le nom de fichier
Il est également possible de mélanger deux syntaxes, bien que cela ne soit pas recommandé.
comme-iname --full
ou-anewer +5
Vous trouverez ci-dessous quelques exemples simples. En savoir plus sur la façon de les utiliser ici.
# Find C source files containing "hello"; orient style only
orient / -content-strstr hello -name " *.c "
# Many `find` style predicates are actually aliases, ex:
orient / -iname " *.cpp " # find style
orient / -name --ignore-case " *.cpp " # orient style
# Assuming /home/a/b links to /var/tmp, then
# all the following 3 lines matches /home/a/b
# `-lname` is identical to `-name --readlink`
orient / -lname " *tmp "
orient / -name --readlink " *tmp "
# `orient` style is more versatile:
orient / -bregex --readlink ' tmp$ ' # No `find` style alternative
Avec l'introduction des prédicats modificateurs, il est possible de "faire quelque chose" avant de se propager à d'autres preds, ce qui est exactement ce que font -updir
et -downdir
: ils correspondent au parent des fichiers et aux enfants des répertoires.
Avec des modificateurs, -updir -downdir
peut être appliqué à n'importe quel prédicat dans orient
, contrairement à Everything
dont le parent codé en dur correspond uniquement à la correspondance de chaîne.
Tout prédicat inclut l'utilisation récursive de -updir -downdir
eux-mêmes.
De plus, -downdir
a une surcharge de presque 0 et -updir
rend les recherches encore plus rapides en mettant en cache les correspondances récentes.
Certains modificateurs supplémentaires incluent -prunemod
, -quitmod
et -not
. Ex:
# Find bin/gcc*
orient / -updir -name " gcc* " -a -executable
# Find bin/gcc* or bin/clang*
orient / -updir ( -name " gcc* " -o -name " clang* " ) -a -executable
# Find git repositories, first level only
orient / -downdir ( -name .git -a -type d ) -a -prune
# Must use -exec test on find and is extremely slow
find .. -type d -a -exec test -d ' {}/.git ' ; -a -print -a -prune
# .cc files under src directory of a git repository
orient / -updir ( -name src -a -updir -downdir -name .git ) -name " *.cc "
Puisque l'application est une CLI, récupérez simplement l'exécutable de votre système et cela devrait fonctionner.
Sous Linux,
-user -nouser -group -nogroup
nécessite que la glibc fonctionne.
Malheureusement, la version macOS ARM est manquante car je n'ai pas une telle machine ?. N'hésitez pas à indiquer si cela fonctionne sur un problème ou une discussion.
Actuellement, cette application est trop peu testée pour être distribuée.
Peut être publié sur Arch AUR d'abord.
La construction à partir des sources est recommandée dès les premiers stades de la publication. Essayez-le ! (Obligatoire pour v0.4.0
)
Ou mieux encore, créez à la fois orient
et SearchEverywhere. En construisant SearchEverywhere
, orient
est également construit. Construire des dépendances :
Mis à part CMake
, toutes les dépendances peuvent être téléchargées automatiquement par CMake.
En utiliser un installé est également possible, si vous en avez déjà installé certains sur votre système, en basculant ces options de configuration ci-dessous.
Configurer les options :
ORIE_TEST
: créer des suites de tests GoogleTestORIE_SYSTEM_PCRE2
: utilisez la bibliothèque système PCRE2 au lieu d'en compiler une nouvelle.ORIE_LINK_STATIC
: exécutable orienté de lien statiqueORIE_SYSTEM_RAPIDFUZZ
: Utiliser la bibliothèque System rapidfuzz (en-tête uniquement) Remplacez l' OPTION
ci-dessous par vos options activées et exécutez les commandes suivantes :
git clone https://github.com/cxxsucks/orient.git
cd orient ; mkdir build ; cd build
cmake -DOPTION1=ON -DOPTION2=ON -DCMAKE_BUILD_TYPE=Release ..
make -j $( nproc )
sudo make install
La génération de configuration par défaut code en dur certains points de départ et permet une lecture multithread sur chacun d'eux, ce qui n'est pas optimal pour les disques durs rotatifs.
Si vous utilisez des disques durs, procédez comme suit lors de la première exécution orient
:
orient -updatedb
Ctrl-C
~/.config/orie/default.txt
ou %APPDATA%.oriedefault.txt
ROOT
, supprimez le champ SSD
si l'un de ces chemins n'est réellement pas sur SSD.ROOT "/path/to/mountpoint"
ou ne l'indexez tout simplement pas avec IGNORED "/path/to/mountpoint"
. Sous Linux, /sys/block/sda/queue/rotational
fournit des informations sur la rotation d'un disque, ce que macOS et Windows n'ont malheureusement pas (mais comme prévu).
Dans une prochaine version, les points racine seront acquis à partir de /etc/mtab
et /sys/.../rotational
, qui configurent automatiquement les chemins racine sous Linux et macOS.
Apple est tellement cool ! ILS DOIVENT AVOIR ÉQUIPÉ LEURS MACBOOKS DES MEILLEURS DISQUES DURS AU MONDE ET N'EST DÉFINITIVEMENT PAS ROTATIF !
La série exec
de prédicats est implémentée, mais non testée, sous Windows.
Et une expérience modérée en génie logiciel indiquerait que les fonctionnalités non testées contiendraient certainement des erreurs, voire échoueraient carrément.
Il existe un certain nombre de fonctionnalités non testées, exec
sous Windows étant la seule réellement répertoriée dans la liste des fonctionnalités.
D'autres fonctionnalités non testées sont répertoriées dans la liste TODO, mais pas dans la liste des fonctionnalités, ainsi que les raisons pour lesquelles elles ne sont pas testées.
find
non implémentéesOptions principalement globales :
-context
(contexte SELinux)-printf -fprintf -ls -fls
(Format d'impression)-newerXY
-mindepth
-maxdepth
-H -L -P
(lien symbolique suivant les options globales)-D
(déboguages)-O
(niveau d'optimisation)
orient
a son propre optimiseur similaire àfind -O3
-regextype
(PCRE2 codé en dur)-warn -nowarn
-d -depth
(recherche en profondeur d'abord)
orient
ne peut effectuer une recherche que selon l'index.-delete
n'est cependant pas affecté, contrairementfind
.
-files0-from
-mount -xdev -xautofs
(ne descendez pas dans les montages)-help -version
Les documentations seraient au centre des travaux ces derniers temps.
Les rapports de bogues et les demandes de fonctionnalités sont toujours acceptés de toute façon, dans GitHub Issues Tracker de ce référentiel.
Voir la liste TODO pour plus de détails.
dirent
Unix vers WindowsFortement modifié ici pour le lien symbolique et le (faux) périphérique, support de socket, il est donc directement placé dans la source au lieu du module.