简体中文
Ein plattformübergreifender Dateisystem-Indexer und -Sucher, der die Vorzüge von find
“, locate
und „ Everything
“ sowie die Suche nach Dateiinhalten kombiniert. Funktioniert unter Linux, macOS und Windows.
Inverted Index, die Technologie hinter plocate
, die Suchvorgänge in nahezu konstanter Zeit ermöglicht, ist in v0.4.0
und höher implementiert . Leider ist v0.4
nicht ausreichend getestet und die Version ist derzeit v0.3.x
Außerdem wurden alle Demonstrationen in der README-Datei auf v0.3.0
durchgeführt. Bei Personalcomputern, die normalerweise weniger als 3 Millionen Dateien haben, macht der invertierte Index jedoch keinen allzu großen Unterschied.
Inhaltssuchen werden nicht indiziert. An der Indizierung des Dateiinhalts wird gearbeitet, wenn dieses Repo 512 Sterne erreicht hat. Klicken Sie also auf den Stern-Button, wenn sich die App als nützlich für Sie erweist oder wenn Sie sie interessant finden!
(Mehr dazu hier.)
In dieser README-Datei geht es um die CLI-Anwendung. Informationen zum GUI-Frontend finden Sie unter SearchEverywhere. (auch ziemlich instabil)
An diesem Projekt wurde seit August 2022 gearbeitet, es wurde jedoch aufgrund unzähliger Fehler erst im April 2023 veröffentlicht. Derzeit kann es jedoch auch in der stabilen Version ( v0.3.x
) noch unzählige Fehler geben.
Die einzige Laufzeitabhängigkeit ist PCRE2, und eine vollständig statische ausführbare Datei ist nur 2,5 MB groß (entfernt).
Der erste Libre-Dateiindexer überhaupt für macOS und Windows!?
/System/Volumes/Data
den Tricks find
Screenshot unter macOS bzw. Windows:
updatedb
(nur SSD) Im Gegensatz zu locate
erfordert die Neuerstellung des Dateisystemindex KEINE Root-Berechtigung (oder Administratorrechte unter Windows). Auch kein Setugid.
Für SSDs wird ein Thread-Pool für gleichzeitige Verzeichnislesevorgänge eingerichtet, was die Lesegeschwindigkeit drastisch beschleunigt.
Bei Festplatten sollte diese Funktion deaktiviert werden, da Multithread-IO aufgrund ihrer rotierenden Natur keine sichtbaren Leistungssteigerungen bringt.
Ob Multithread- updatedb
aktiviert werden soll, kann pro Pfad umgeschaltet werden.
Die Abbildung zeigt, dass orient
810.000 Dateien innerhalb von 1 Sekunde mit gelöschtem Cache scannen kann, die verwendete Festplatte ist jedoch eher hochwertig. Nehmen Sie es jedoch mit Vorsicht.
Wie bei updatedb
wird auch für den Inhaltsabgleich derselbe Thread-Pool verwendet. Der Fuzzy-Abgleich von hello world
aus dem 75.000 Dateien umfassenden Linux-Kernel-Quellbaum dauerte 5,5 Sekunden, wenn der Cache gelöscht wurde, und 1,5 Sekunden mit Cache.
(mit Vorsicht zu genießen; 16x Intel i7 11800H und NVMe SSD)
Unter Windows ist der Inhaltsabgleich deutlich langsamer , was auf die Konvertierung von UTF8 in UTF16, das Fehlen einer effizienten Kernel-Speicherzuordnung (
mmap(2)
) und die aufgeblähte, ineffiziente Natur von Windows zurückzuführen ist.
Auf Wiedersehen find ... | xargs grep ...
und find ... -a -exec grep ...
find
-ähnliche Syntax Wie unten gezeigt, implementiert orient
auch große Teile der find
-Übereinstimmungen, sodass sich Benutzer leichter mit vorhandener Erfahrung in der Verwendung find
vertraut machen können und gleichzeitig die Vielseitigkeit der App erhöht wird.
Im Gegensatz zu Everything
bei dem nur harte Code-Parent-Matches mit String-Matching übereinstimmen, kann -updir -downdir
in orient
auf jedes Prädikat angewendet werden.
Außerdem verursacht -downdir
fast keinen Overhead, und -updir
macht die Suche noch schneller, indem aktuelle Übereinstimmungen zwischengespeichert werden.
Passender Elternteil:
Passende Kinder:
Linux | Windows | macOS | Android | Lizenz | |
---|---|---|---|---|---|
Everything | ?NEIN | ?JA | ?NEIN | ?NEIN | Proprietär |
find | ?JA | ?NEIN | ?NEIN | ?NEIN | GPLv3 |
fsearch | ?JA | ?NEIN | ?NEIN | ?NEIN | GPLv2 |
locate | ?JA | ?NEIN | ?NEIN | ?NEIN | GPLv3 |
orient | ?JA | ?JA | ?JA | ?NEIN | GPLv3 |
Fortsetzung der Tabelle
-and -or | Index umkehren | Übereinstimmendes übergeordnetes Element | GUI | CLI | |
---|---|---|---|---|---|
Everything | ?JA | ?NEIN | Teilweise | ?JA | ? |
find | ?JA | ?NEIN | ?NEIN | ?NEIN | ?JA |
fsearch | ?JA | ?NEIN | Teilweise | ?JA | ?NEIN |
locate | ?NEIN | ?JA | ?NEIN | ?NEIN | ?JA |
orient | ?JA | ?JA | ?JA | ?JA | ?JA |
Hinweise:
Everything
CLI scheinen alle Ergebnisse verschönert zu sein, was die Verwendung in Kombination mit anderen Tools sehr schwierig macht, daher das ? Gesicht.eVeRyThInG
IST EIGENTUM, NUR SDK WIRD ZUR VERFÜGUNG GESTELLT!!! Unser lieber Anführer Richard StAlLman wird es mit Atomwaffen zerstören!!!Was noch schlimmer ist:
Everything SDK
ist voller globaler Zustände.
find
-ähnliche Syntax Benutzer, die mit find
vertraut sind, können mit find
kompatiblen Prädikaten von orient
, wie -regex
, -lname
, -okdir
und anderen, loslegen.
Beachten Sie, dass orient
manchmal eine Obermenge ihrer find
sind, z. B. -quit
akzeptiert optional ein ganzzahliges Argument, das angibt, wie viele Ergebnisse vor dem Beenden erzeugt werden können. Der Standardwert ist 1, sodass es bei Verwendung -quit
ohne Argumente keinen Unterschied zu dem in find
gibt.
Für für orient
spezifische Prädikate wird nur die Syntax orient
-Stil bereitgestellt, siehe unten.
# 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
hat nicht so viele (eindeutige) Prädikate wie find
. orient
stattdessen an -PRED --ARG
Syntax, um einem einzelnen Prädikat mehrere Matching-Schemata zu verleihen und so die Wiederverwendbarkeit des Codes zu erhöhen.
-name
-bregex
-strstr
-fuzz
--ignore-case
(außer -fuzz
) --full
--readlink
-content-{strstr,fuzz,regex}
--ignore-case
(außer Fuzz) --blocked
--allow-binary
-size
-{a,m,c}{time,min}
-inum
+
oder -
Viele find
, dass es sich bei kompatiblen Prädikaten tatsächlich um Aliase handelt
-lname
ist identisch mit -name --readlink
-regex
- -bregex --ignore-case
(das b
steht für Basisnamen)
-samefile
ist im Grunde -inode
da -inode
auch Dateinamen akzeptiert
Es ist auch möglich, zwei Syntaxen zu mischen, dies wird jedoch nicht empfohlen
wie-iname --full
oder-anewer +5
Nachfolgend finden Sie einige einfache Beispiele. Weitere Informationen zur Verwendung finden Sie hier.
# 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
Mit der Einführung von Modifikatorprädikaten ist es möglich, „etwas zu tun“, bevor es an andere Prädikate weitergegeben wird, was genau das ist, was -updir
und -downdir
tun: Sie gleichen die übergeordneten Dateien und untergeordneten Verzeichnisse ab.
Mit Modifikatoren kann -updir -downdir
auf jedes Prädikat in orient
angewendet werden, im Gegensatz zu „ Everything
dessen übergeordnetes Element im Hardcode nur mit String-Matching übereinstimmt“.
Jedes Prädikat beinhaltet die rekursive Verwendung von -updir -downdir
selbst.
Außerdem verursacht -downdir
fast keinen Overhead, und -updir
macht die Suche noch schneller, indem die letzten Übereinstimmungen zwischengespeichert werden.
Zu den weiteren Modifikatoren gehören -prunemod
, -quitmod
und -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 "
Da es sich bei der Anwendung um eine CLI handelt, greifen Sie einfach auf die ausführbare Datei Ihres Systems zurück und es sollte funktionieren.
Unter Linux benötigt
-user -nouser -group -nogroup
glibc, um zu funktionieren.
Leider fehlt die macOS ARM-Version, da ich keine solche Maschine habe? Melden Sie sich gerne, ob es bei einem Problem oder einer Diskussion funktioniert.
Derzeit ist diese App zu wenig getestet, um sie für eine Distribution zu veröffentlichen.
Kann übrigens zuerst für Arch AUR veröffentlicht werden.
Die Erstellung aus dem Quellcode wird in der frühen Phase der Veröffentlichung empfohlen. Probieren Sie es aus! (Erforderlich für v0.4.0
)
Oder noch besser: Erstellen Sie sowohl orient
als auch SearchEverywhere. Durch die Erstellung SearchEverywhere
wird auch orient
erstellt. Abhängigkeiten erstellen:
Abgesehen von CMake
können alle Abhängigkeiten automatisch von CMake heruntergeladen werden.
Wenn Sie einige davon bereits auf Ihrem System installiert haben, ist die Verwendung einer installierten Version auch möglich, indem Sie die folgenden Konfigurationsoptionen umschalten.
Optionen konfigurieren:
ORIE_TEST
: Erstellen Sie GoogleTest-TestsuitenORIE_SYSTEM_PCRE2
: Verwenden Sie die System PCRE2-Bibliothek, anstatt eine neue zu kompilieren.ORIE_LINK_STATIC
: Ausführbare Orient-Datei statisch verknüpfenORIE_SYSTEM_RAPIDFUZZ
: System-Rapidfuzz-Bibliothek verwenden (nur Header) Ersetzen Sie die OPTION
unten durch Ihre aktivierten Optionen und führen Sie die folgenden Befehle aus:
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
Die Standardkonfigurationsgenerierung codiert einige Startpunkte fest und ermöglicht Multithread-Lesevorgänge auf allen, was für rotierende Festplatten nicht optimal ist.
Wenn Sie Festplatten verwenden, gehen Sie beim ersten Start von orient
wie folgt vor:
orient -updatedb
ausCtrl-C
~/.config/orie/default.txt
oder %APPDATA%.oriedefault.txt
ROOT
und entfernen Sie das SSD
Feld, wenn einer dieser Pfade tatsächlich nicht auf SSD liegt.ROOT "/path/to/mountpoint"
oder indizieren Sie sie einfach nicht mit IGNORED "/path/to/mountpoint"
. Unter Linux bietet /sys/block/sda/queue/rotational
Erkenntnisse darüber, ob eine Festplatte rotierend ist, was macOS und Windows leider (aber erwartungsgemäß) nicht haben.
In einer zukünftigen Version werden Root-Punkte von /etc/mtab
und /sys/.../rotational
bezogen, die Root-Pfade unter Linux und macOS automatisch konfigurieren.
Apple ist so cool! SIE MÜSSEN IHRE MACBOOKS MIT DEN BESTEN FESTPLATTEN DER WELT AUSGESTATTET HABEN UND IST DEFINITIV NICHT ROTATIONAL!
Die exec
-Prädikateserie ist unter Windows implementiert, aber nicht getestet.
Und eine mäßige Erfahrung in der Softwareentwicklung würde zeigen, dass ungetestete Funktionen mit Sicherheit Fehler enthalten oder sogar völlig scheitern würden.
Es gibt eine Reihe ungetesteter Funktionen, wobei exec
unter Windows die einzige Funktion ist, die tatsächlich in der Funktionsliste aufgeführt ist.
Andere ungetestete Funktionen werden in der TODO-Liste aufgeführt, jedoch nicht in der Feature-Liste, zusammen mit den Gründen, warum sie nicht getestet wurden.
find
Meist globale Optionen:
-context
(SELinux-Kontext)-printf -fprintf -ls -fls
(Formatdruck)-newerXY
-mindepth
-maxdepth
-H -L -P
(Symlink folgt globalen Optionen)-D
(debugopts)-O
(Ebene optimieren)
orient
verfügt über einen eigenen Optimierer, derfind -O3
ähnelt
-regextype
(hartcodiertes PCRE2)-warn -nowarn
-d -depth
(Tiefensuche zuerst)
orient
kann nur nach Index suchen.-delete
ist im Gegensatz zufind
jedoch nicht betroffen.
-files0-from
-mount -xdev -xautofs
(nicht in Mounts absteigen)-help -version
Dokumentationen würden in letzter Zeit im Mittelpunkt der Arbeiten stehen.
Fehlerberichte und Funktionsanfragen werden im GitHub Issues Tracker dieses Repositorys trotzdem weiterhin akzeptiert.
Einzelheiten finden Sie in der TODO-Liste.
dirent
Port zu WindowsHier stark modifiziert für Symlink- und (gefälschte) Geräte- und Socket-Unterstützung, daher wird es direkt in die Quelle statt in das Modul eingefügt.