简体中文
Un indexador y buscador de sistemas de archivos multiplataforma que combina las ventajas de find
, locate
y Everything
, además de búsquedas de contenido de archivos. Funciona en Linux, macOS y Windows.
El índice invertido, la tecnología detrás de plocate
que realiza búsquedas en un tiempo casi constante, se implementa en v0.4.0
y superior . Desafortunadamente, v0.4
no está bien probada y la versión actualmente es v0.3.x
Además, todas las demostraciones en README se realizan en v0.3.0
. Sin embargo, para las computadoras personales que generalmente tienen archivos de menos de 3 M, el índice invertido no hace mucha diferencia.
Las búsquedas de contenido no están indexadas. Se trabajará en la indexación del contenido del archivo si este repositorio alcanzó las 512 estrellas, así que aprieta el botón de estrella si la aplicación te resulta útil o si la encuentras interesante.
(Más sobre esto aquí.)
Este archivo README trata sobre la aplicación CLI. Para la interfaz gráfica de usuario, consulte SearchEverywhere. (también bastante inestable)
Se empezó a trabajar en este proyecto desde agosto de 2022, pero no se publicó hasta abril de 2023 debido a innumerables errores. Sin embargo, es posible que todavía haya innumerables errores, incluso en la versión estable ( v0.3.x
).
La única dependencia del tiempo de ejecución es PCRE2, y un ejecutable completamente estático tiene un tamaño de solo 2,5 MiB (eliminado).
¿¡El primer indexador de archivos Libre en macOS y Windows !?
/System/Volumes/Data
que trucos find
Captura de pantalla en macOS y Windows respectivamente:
updatedb
con múltiples subprocesos y sin raíz (solo SSD) A diferencia de locate
, reconstruir el índice del sistema de archivos NO requiere permiso de root (o administrador en Windows). Tampoco setugid.
Para los SSD, se configura un grupo de subprocesos para lecturas simultáneas de directorios, lo que acelera drásticamente la velocidad de lectura.
Para los discos duros, esta característica debe estar deshabilitada, ya que la E/S multiproceso no proporciona ganancias de rendimiento visibles debido a su naturaleza giratoria.
Si se habilitará updatedb
múltiples se puede alternar por ruta.
La figura muestra que orient
puede escanear 810.000 archivos en 1 segundo sin caché , pero el disco utilizado es de gama bastante alta. Aunque tómalo con cautela.
Al igual que updatedb
, el mismo grupo de subprocesos también se utiliza para la coincidencia de contenido. La coincidencia difusa de hello world
del árbol de fuentes del kernel de Linux de 75000 archivos tomó 5,5 segundos cuando se cayó el caché y 1,5 segundos con el caché.
(tómelo con cautela; 16x Intel i7 11800H y NVMe SSD)
En Windows, la coincidencia de contenido es significativamente más lenta , un efecto combinado de la conversión de UTF8 a UTF16, la falta de un mapeo eficiente de la memoria del kernel (
mmap(2)
) y la naturaleza hinchada e ineficiente de Windows.
Adiós find ... | xargs grep ...
y find ... -a -exec grep ...
find
sintaxis similar Como se muestra a continuación, orient
también implementa una gran parte de las coincidencias de find
, lo que hace que los usuarios se familiaricen fácilmente con la experiencia existente en el uso find
y al mismo tiempo aumenta la versatilidad de la aplicación.
A diferencia de Everything
que codifica la coincidencia principal solo con la coincidencia de cadenas, en orient
, -updir -downdir
se puede aplicar a cualquier predicado.
Además, -downdir
tiene una sobrecarga de casi 0 y -updir
hace que las búsquedas sean aún más rápidas al almacenar en caché las coincidencias recientes.
Padre coincidente:
Niños coincidentes:
linux | ventanas | macos | Androide | Licencia | |
---|---|---|---|---|---|
Everything | ?NO | ?SÍ | ?NO | ?NO | Propiedad |
find | ?SÍ | ?NO | ?NO | ?NO | GPLv3 |
fsearch | ?SÍ | ?NO | ?NO | ?NO | GPLv2 |
locate | ?SÍ | ?NO | ?NO | ?NO | GPLv3 |
orient | ?SÍ | ?SÍ | ?SÍ | ?NO | GPLv3 |
Tabla continuada
-and -or | Invertir índice | Coincidir con el padre | GUI | CLI | |
---|---|---|---|---|---|
Everything | ?SÍ | ?NO | Parcial | ?SÍ | ? |
find | ?SÍ | ?NO | ?NO | ?NO | ?SÍ |
fsearch | ?SÍ | ?NO | Parcial | ?SÍ | ?NO |
locate | ?NO | ?SÍ | ?NO | ?NO | ?SÍ |
orient | ?SÍ | ?SÍ | ?SÍ | ?SÍ | ?SÍ |
Notas:
Everything
CLI parece tener todos los resultados embellecidos , lo que hace que sea muy difícil de usar en combinación con otras herramientas, de ahí el ? rostro.eVeRyThInG
, SOLO SE PROPORCIONA SDK!!! ¡¡¡NUESTRO QUERIDO LÍDER RICHARD STALLMAN LO DESTRARÁ!!!Lo que es peor,
Everything SDK
está lleno de estados globales?
find
Los usuarios que estén familiarizados con find
podrían comenzar con los predicados compatibles con find
de orient
, como -regex
, -lname
, -okdir
y otros.
Tenga en cuenta que los predicados orient
a veces son un superconjunto de sus contrapartes find
, como -quit
acepta opcionalmente un argumento entero que significa cuántos resultados se pueden producir antes de salir. Su valor predeterminado es 1, por lo que cuando se usa -quit
sin argumentos no hay diferencia con el de find
.
Para predicados específicos de orient
, solo se proporciona la sintaxis de estilo orient
, consulte a continuación.
# 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
no tiene tantos predicados (únicos) como find
. En su lugar, orient
el uso de la sintaxis -PRED --ARG
, proporcionando múltiples esquemas de coincidencia para un solo predicado, lo que aumenta la reutilización del código.
-name
-bregex
-strstr
-fuzz
--ignore-case
(excepto -fuzz
) --full
--readlink
-content-{strstr,fuzz,regex}
--ignore-case
(excepto fuzz) --blocked
--allow-binary
-size
-{a,m,c}{time,min}
-inum
+
o -
find
predicados compatibles son en realidad alias, como
-lname
es idéntico a -name --readlink
-regex
- -bregex --ignore-case
(la b
significa nombre base)
-samefile
es básicamente -inode
ya que -inode
también acepta nombres de archivos
También es posible mezclar dos sintaxis, aunque no se recomienda.
como-iname --full
o-anewer +5
A continuación se muestran algunos ejemplos sencillos. Vea más sobre cómo usarlos aquí.
# 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
Con la introducción de predicados modificadores, es posible "hacer algo" antes de propagarse a otras preds, que es exactamente lo que hacen -updir
y -downdir
: coinciden con el padre de los archivos y los hijos de los directorios.
Con modificadores, -updir -downdir
se puede aplicar a cualquier predicado en orient
, a diferencia de Everything
, cuyo código principal coincide únicamente con la coincidencia de cadenas.
Cualquier predicado incluye el uso recursivo de -updir -downdir
.
Además, -downdir
tiene una sobrecarga de casi 0 y -updir
hace que las búsquedas sean aún más rápidas al almacenar en caché las coincidencias recientes.
Algunos modificadores más incluyen -prunemod
, -quitmod
y -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 "
Dado que la aplicación es una CLI, simplemente tome el ejecutable de su sistema y debería funcionar.
En Linux,
-user -nouser -group -nogroup
requiere glibc para funcionar.
Desafortunadamente, falta la versión macOS ARM porque no tengo una de esas máquinas. No dude en informar si funciona en un tema o discusión.
Actualmente, esta aplicación está muy poco probada para lanzarse a una distribución.
Mayo lanzamiento a Arch AUR primero por cierto.
Se recomienda compilar desde el código fuente en la etapa inicial del lanzamiento. ¡Pruébalo! (Requerido para v0.4.0
)
O incluso mejor, cree tanto orient
como SearchEverywhere. Al construir SearchEverywhere
, también se construye orient
. Construir dependencias:
Aparte de CMake
, CMake puede descargar automáticamente todas las dependencias.
También es posible usar uno instalado, si ya ha instalado algunos de ellos en su sistema, alternando estas opciones de configuración a continuación.
Configurar opciones:
ORIE_TEST
: crear conjuntos de pruebas de GoogleTestORIE_SYSTEM_PCRE2
: utilice la biblioteca PCRE2 del sistema en lugar de compilar una nueva.ORIE_LINK_STATIC
: vincular estáticamente el ejecutable orientadoORIE_SYSTEM_RAPIDFUZZ
: Usar la biblioteca Rapidfuzz del sistema (solo encabezado) Reemplace la OPTION
a continuación con sus opciones habilitadas y ejecute los siguientes comandos:
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 generación de configuración predeterminada codifica algunos puntos de partida y permite la lectura multiproceso en todos ellos, lo cual no es óptimo para discos duros rotativos.
Si utiliza discos duros, haga lo siguiente la primera vez que ejecute orient
:
orient -updatedb
Ctrl-C
~/.config/orie/default.txt
o %APPDATA%.oriedefault.txt
ROOT
y elimine el campo SSD
si alguna de estas rutas en realidad no está en SSD.ROOT "/path/to/mountpoint"
o simplemente no la indexe con IGNORED "/path/to/mountpoint"
. En Linux, /sys/block/sda/queue/rotational
proporciona información sobre si un disco es rotacional, algo que desafortunadamente (pero como era de esperar) macOS y Windows no tienen.
En una versión futura, los puntos raíz se adquirirán de /etc/mtab
y /sys/.../rotational
, que configuran automáticamente las rutas raíz en Linux y macOS.
¡Apple es tan genial! ¡DEBEN HABER EQUIPADO SUS MacBookS CON LOS MEJORES DISCOS DUROS DEL MUNDO Y DEFINITIVAMENTE NO ES ROTACIONAL!
La serie exec
de predicados se implementa, pero no se prueba, en Windows.
Y una cantidad moderada de experiencia en ingeniería de software indicaría que las funciones no probadas ciertamente contendrían errores, o incluso fallarían por completo.
Hay una serie de características no probadas, siendo exec
en Windows la única que realmente figura en la lista de características.
Otras funciones no probadas se enumeran en la lista TODO, pero no en la lista de funciones, junto con las razones por las que no se prueban.
find
no implementadasOpciones principalmente globales:
-context
(contexto SELinux)-printf -fprintf -ls -fls
(Formato de impresión)-newerXY
-mindepth
-maxdepth
-H -L -P
(enlace simbólico siguiendo opciones globales)-D
(depuraciones)-O
(optimizar nivel)
orient
tiene su propio optimizador similar afind -O3
-regextype
(PCRE2 codificado)-warn -nowarn
-d -depth
(primera búsqueda en profundidad)
orient
sólo puede buscar según el índice.-delete
no se ve afectado, a diferencia defind
.
-files0-from
-mount -xdev -xautofs
(no desciende a las monturas)-help -version
Las documentaciones serían el centro de los trabajos recientemente.
Los informes de errores y las solicitudes de funciones aún se aceptan de todos modos en el GitHub Issues Tracker de este repositorio.
Consulte Lista de tareas pendientes para obtener más detalles.
dirent
de Unix a WindowsMuy modificado aquí para enlace simbólico y dispositivo (falso), soporte de socket, por lo tanto, se coloca directamente en la fuente en lugar del módulo.