简体中文
Um indexador e pesquisador de sistema de arquivos de plataforma cruzada que combina os méritos de find
, locate
e Everything
, além de pesquisas de conteúdo de arquivo. Funciona em Linux, macOS e Windows.
O índice invertido, a tecnologia por trás plocate
que faz pesquisas em tempo quase constante, é implementado na v0.4.0
e superior . Infelizmente, v0.4
não foi bem testada e a versão atualmente é v0.3.x
. Além disso, todas as demonstrações no README são feitas na v0.3.0
. Para computadores pessoais que geralmente possuem menos de 3 milhões de arquivos, o índice invertido não faz muita diferença.
As pesquisas de conteúdo não são indexadas. A indexação do conteúdo do arquivo de indexação será trabalhada se este repositório atingir 512 estrelas, então aperte o botão de estrela se o aplicativo for útil para você ou se você achar interessante!
(Mais sobre isso aqui.)
Este README é sobre o aplicativo CLI. Para interface GUI, consulte SearchEverywhere. (também bastante instável)
Este projeto começou a ser trabalhado desde agosto de 2022, mas só foi publicado em abril de 2023 devido a inúmeros bugs. Ainda pode haver inúmeros bugs atualmente, mesmo na versão estável ( v0.3.x
).
A única dependência de tempo de execução é PCRE2, e um executável totalmente estático tem apenas 2,5 MiB de tamanho (removido).
O primeiro indexador de arquivos gratuito no macOS e no Windows!?
/System/Volumes/Data
do macOS que os truques find
Captura de tela no macOS e Windows, respectivamente:
updatedb
multithread e não raiz (somente SSD) Ao contrário de locate
, a reconstrução do índice do sistema de arquivos NÃO requer permissão de root (ou Administrador no Windows). Nada de setugido também.
Para SSDs, um pool de threads é configurado para leituras simultâneas de diretório, acelerando drasticamente a velocidade de leitura.
Para HDDs, esse recurso deve ser desativado, pois a E/S multithread não oferece ganhos visíveis de desempenho devido à sua natureza giratória.
Se updatedb
multithreaded deve ser habilitado pode ser alternado por caminho.
A figura mostra que orient
pode verificar 810.000 arquivos em 1 segundo com cache descartado , mas o disco usado é bastante sofisticado. Porém, aceite-o com cautela.
Assim como updatedb
, o mesmo conjunto de threads também é usado para correspondência de conteúdo. A correspondência difusa hello world
da árvore de origem do kernel Linux de 75.000 arquivos levou 5,5 segundos quando o cache foi descartado e 1,5 segundos com o cache.
(leve com cautela; 16x Intel i7 11800H e SSD NVMe)
No Windows, a correspondência de conteúdo é significativamente mais lenta , um efeito combinado da conversão de UTF8 para UTF16, da falta de mapeamento eficiente da memória do kernel (
mmap(2)
) e da natureza inchada e ineficiente do Windows.
Adeus, find ... | xargs grep ...
e find ... -a -exec grep ...
find
Conforme mostrado abaixo, orient
também implementa grandes porções de correspondências de find
, tornando mais fácil para os usuários se familiarizarem com a experiência existente no uso find
, ao mesmo tempo, aumentando a versatilidade do aplicativo.
Ao contrário de Everything
cujo pai do código rígido corresponde apenas à correspondência de string, em orient
, -updir -downdir
pode ser aplicado a qualquer predicado.
Além disso, -downdir
tem quase 0 sobrecarga e -updir
torna as pesquisas ainda mais rápidas, armazenando em cache as correspondências recentes.
Pai correspondente:
Crianças correspondentes:
Linux | Windows | macOS | Android | Licença | |
---|---|---|---|---|---|
Everything | ?NÃO | ?SIM | ?NÃO | ?NÃO | Proprietário |
find | ?SIM | ?NÃO | ?NÃO | ?NÃO | GPLv3 |
fsearch | ?SIM | ?NÃO | ?NÃO | ?NÃO | GPLv2 |
locate | ?SIM | ?NÃO | ?NÃO | ?NÃO | GPLv3 |
orient | ?SIM | ?SIM | ?SIM | ?NÃO | GPLv3 |
Tabela Continuada
-and -or | Inverter índice | Corresponder pai | GUI | CLI | |
---|---|---|---|---|---|
Everything | ?SIM | ?NÃO | Parcial | ?SIM | ? |
find | ?SIM | ?NÃO | ?NÃO | ?NÃO | ?SIM |
fsearch | ?SIM | ?NÃO | Parcial | ?SIM | ?NÃO |
locate | ?NÃO | ?SIM | ?NÃO | ?NÃO | ?SIM |
orient | ?SIM | ?SIM | ?SIM | ?SIM | ?SIM |
Notas:
Everything
CLI parece ter todos os resultados embelezados , tornando muito difícil o uso em combinação com outras ferramentas, daí o ? face.eVeRyThInG
É PROPRIETÁRIO, SOMENTE FORNECIDO POR SdK!!! Nosso querido líder rIcHaRd StalLmAn irá detoná-lo!!!O que é pior,
Everything SDK
está repleto de estados globais.
find
Os usuários familiarizados com find
podem começar com predicados compatíveis com orient
find
, como -regex
, -lname
, -okdir
e outros.
Observe que os predicados orient
às vezes são um superconjunto de suas contrapartes find
, como -quit
aceita opcionalmente um argumento inteiro, significando quantos resultados podem ser produzidos antes de encerrar. Seu valor padrão é 1 para que ao usar -quit
sem argumentos não haja diferença em relação ao find
.
Para predicados específicos de orient
, apenas a sintaxe do estilo orient
é fornecida, veja abaixo.
# 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ão tem tantos predicados (únicos) quanto find
. Em vez disso, orient
o uso da sintaxe -PRED --ARG
, fornecendo vários esquemas de correspondência para um único predicado, aumentando a capacidade de reutilização do código.
-name
-bregex
-strstr
-fuzz
--ignore-case
(exceto -fuzz
) --full
--readlink
-content-{strstr,fuzz,regex}
--ignore-case
(exceto fuzz) --blocked
--allow-binary
-size
-{a,m,c}{time,min}
-inum
+
ou -
Muitos find
que predicados compatíveis são na verdade aliases, como
-lname
é idêntico a -name --readlink
-regex
- -bregex --ignore-case
( b
significa nome de base)
-samefile
é basicamente -inode
já que -inode
também aceita nome de arquivo
Também é possível misturar duas sintaxes, embora não seja recomendado
como-iname --full
ou-anewer +5
Abaixo estão alguns exemplos simples. Veja mais sobre como usá-los aqui.
# 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
Com a introdução de predicados modificadores, é possível "fazer algo" antes de propagar para outros preds, que é exatamente o que -updir
e -downdir
fazem: eles correspondem ao pai dos arquivos e aos filhos dos diretórios.
Com modificadores, -updir -downdir
pode ser aplicado a qualquer predicado em orient
, ao contrário de Everything
cujo pai do código rígido corresponde apenas à correspondência de string.
Qualquer predicado inclui o uso recursivo dos próprios -updir -downdir
.
Além disso, -downdir
tem quase 0 sobrecarga e -updir
torna as pesquisas ainda mais rápidas, armazenando em cache as correspondências recentes.
Mais alguns modificadores incluem -prunemod
, -quitmod
e -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 "
Como o aplicativo é uma CLI, basta pegar o executável do seu sistema e ele deverá funcionar.
No Linux,
-user -nouser -group -nogroup
requer que a glibc funcione.
Infelizmente, a versão macOS ARM está faltando porque não tenho uma dessas máquinas? Sinta-se à vontade para relatar se funciona no assunto ou na discussão.
Atualmente, este aplicativo é muito pouco testado para ser lançado em uma distribuição.
Pode ser lançado primeiro para Arch AUR.
A compilação a partir do código-fonte é recomendada no estágio inicial do lançamento. Experimente! (Obrigatório para v0.4.0
)
Ou melhor ainda, crie orient
e o SearchEverywhere. Ao construir SearchEverywhere
, orient
também é construído. Construir dependências:
Além do CMake
, todas as dependências podem ser baixadas automaticamente pelo CMake.
Usar um instalado também é possível, caso você já tenha instalado alguns deles em seu sistema, alternando as opções de configuração abaixo.
Configurar opções:
ORIE_TEST
: Crie conjuntos de testes do GoogleTestORIE_SYSTEM_PCRE2
: Use a Biblioteca PCRE2 do Sistema em vez de compilar uma nova.ORIE_LINK_STATIC
: Vincular estaticamente o executável orientadoORIE_SYSTEM_RAPIDFUZZ
: Use a biblioteca System Rapidfuzz (somente cabeçalho) Substitua a OPTION
abaixo pelas opções habilitadas e execute os seguintes 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
A geração de configuração padrão codifica alguns pontos de partida e permite a leitura multithread em todos eles, o que não é ideal para discos rígidos rotacionais.
Se acontecer de você usar HDDs, faça o seguinte na primeira vez que executar orient
:
orient -updatedb
Ctrl-C
~/.config/orie/default.txt
ou %APPDATA%.oriedefault.txt
ROOT
e remova o campo SSD
se algum desses caminhos não estiver realmente no SSD.ROOT "/path/to/mountpoint"
ou simplesmente não o indexe com IGNORED "/path/to/mountpoint"
. No Linux, /sys/block/sda/queue/rotational
fornece informações sobre se um disco é rotacional, o que o macOS e o Windows infelizmente (mas esperado) não possuem.
Em uma versão futura, os pontos raiz serão adquiridos de /etc/mtab
e /sys/.../rotational
, que configuram automaticamente os caminhos raiz no Linux e no macOS.
ApPlE é tão legal! ELES DEVEM TER EQUIPADO SEUS MACBOOKS COM OS MELHORES DISCOS RÍGIDOS DO MUNDO E DEFINITIVAMENTE NÃO É ROTATIVO!
A série exec
de predicados é implementada, mas não testada, no Windows.
E uma quantidade moderada de experiência em engenharia de software diria que recursos não testados certamente conteriam erros, se não falhassem completamente.
Existem vários recursos não testados, sendo exec
no Windows o único realmente listado na lista de recursos.
Outros recursos não testados estão listados na lista TODO, mas não na lista de recursos, juntamente com os motivos pelos quais não foram testados.
find
não implementadosPrincipalmente opções globais:
-context
(contexto SELinux)-printf -fprintf -ls -fls
(formato de impressão)-newerXY
-mindepth
-maxdepth
-H -L -P
(link simbólico após opções globais)-D
(depuração)-O
(otimizar nível)
orient
tem seu próprio otimizador semelhante afind -O3
-regextype
(PCRE2 codificado)-warn -nowarn
-d -depth
(primeira pesquisa em profundidade)
orient
só pode pesquisar de acordo com o índice.-delete
não é afetado, ao contrário defind
.
-files0-from
-mount -xdev -xautofs
(não desça nas montagens)-help -version
As documentações seriam o centro dos trabalhos recentemente.
Relatórios de bugs e solicitações de recursos ainda são aceitos de qualquer maneira, no GitHub Issues Tracker deste repositório.
Consulte a lista TODO para obter detalhes.
dirent
do Unix para WindowsFortemente modificado aqui para link simbólico e dispositivo (falso), suporte de soquete, portanto, é colocado diretamente na fonte em vez do módulo.