fsearch README

The project's README from github.com/noahdunnagan/fsearch. As one markdown file: README.md.

FSearch

Whole-disk file search for macOS: names in about 0.1 ms, typo-tolerant, plus indexed search inside files. A CLI with a small daemon, or a Rust crate.

cargo build --release && ./target/release/fsearch install   # -> ~/.local/bin/fsearch
fsearch fsearch main              # find files by name
fsearch 'ext:rs grep:apply_dir'   # search inside files

Speed

M4 Max, 8.3M files on disk, vs the previous version (76d612f). Same results. Medians.

before now
find a file by name 1.0 ms 0.13 ms 7.7×
typing a whole filename, all keystrokes 23 ms 3.0 ms 7.5×
search inside files 14 ms 2.3 ms 6.2×
slowest 10% inside files (Chromium) 38 ms 2.3 ms 16×
CLI, launch to answer 5.5 ms 3.3 ms 1.7×
first run, fully searchable 101 s 49 s 2.1×
first run, peak memory 1.2 GB 0.9 GB
index on disk (Chromium) 0.32 GB 0.76 GB 2.4× bigger

The index grew because each file carries a filter that lets search skip files without the text.

Queries

fsearch 'readme in:~/Developer'          # inside a folder
fsearch 'type:image size:>5mb mtime:<7d'
fsearch 'ext:rs regex:fn\s+\w+_dir'      # regex inside files
fsearch 'sym:apply_dir'                  # where it's defined

Words are fuzzy, and 5+ letter words forgive one typo (mian.rs finds main.rs). Also 'exact, ^prefix, suffix$ and !exclude. Filters: ext: type: kind: in: size: mtime: re: path: grep: regex: sym: limit:. Content search is smart-case.

Full Disk Access

From a terminal with Full Disk Access it indexes everything. As a login item (fsearch install --login), grant ~/.local/bin/fsearch access in System Settings > Privacy & Security, again after each rebuild. Without access it skips protected folders instead of prompting.

API

JSON lines over ~/Library/Application Support/FSearch/fsearch.sock, or fsearch stdio:

{"q": "fsearch main", "limit": 20}
{"op": "grep", "pattern": "apply_dir", "in": "~/Developer"}

Or link the crate:

let engine = fsearch::Engine::start(fsearch::Options { dir: fsearch::default_dir(&home), home: home.clone(), skip: None })?;
let hits = engine.search(&fsearch::Query::parse("fsearch main", &home)?)?;

An app and the CLI share one index: the first process owns it, the rest follow.

How it works

fsearch (noahdunnagan/fsearch)

Searching Database…

2.1K ·GitHub
Что это?FSearch — инструмент поиска файлов по всему диску для macOS, который находит любой файл по имени примерно за миллисекунду, прощает опечатки и умеет искать внутри содержимого файлов с помощью индекса.
Это CLI-инструмент или библиотека для Rust?И то и другое: он поставляется как CLI с небольшим фоновым демоном, а та же функциональность может быть прилинкована в ваш проект как Rust-крейт.
Как его запустить?Запустите его из терминала с выданным Full Disk Access, чтобы он мог обойти весь диск, и по желанию зарегистрируйте как объект входа командой fsearch install --login, чтобы он стартовал автоматически.
Нужно ли сначала выдать Full Disk Access?Для полного охвата — да: FSearch нужен Full Disk Access в Системных настройках, и это разрешение придётся выдавать заново после каждой пересборки бинарника.
Что будет, если Full Disk Access не выдать?Он не станет донимать запросом разрешения — просто молча пропустит защищённые папки, которые не видит, продолжая индексировать всё остальное.
Работает ли он и на Linux или только на macOS?Он создан специально для macOS: опирается на getattrlistbulk и FSEvents для обхода и живых обновлений, а разрешения выдаются через Системные настройки macOS.
Покидают ли мои данные компьютер?Нет — всё работает локально: фоновый демон единожды обходит диск и хранит индекс на устройстве, а совпадения в содержимом читаются прямо с локального диска, а не где-то хранятся или куда-то отправляются.
Как fsearch сравнивается с инструментом вроде fff?В тесте на 509 тысяч файлов fsearch находит файл по имени за 1,1 мс против 13,8 мс у fff, ищет по содержимому за 5,6 мс против 53 мс и использует 50 МБ памяти на весь диск против 358 МБ у fff на одной-единственной папке.
Какой синтаксис запросов он поддерживает?Запросы по умолчанию нечёткие (слова из 5+ букв прощают одну опечатку), доступны 'exact, ^prefix, suffix$ и !exclude, плюс фильтры вроде ext:, type:, kind:, in:, size:, mtime:, re:, path:, grep:, regex:, sym: и limit:.
Как он остаётся в курсе изменений файлов?При старте он единожды обходит весь диск с getattrlistbulk, а дальше поддерживает актуальность через слежение за FSEvents, так что новые, переименованные или удалённые файлы появляются примерно за 0,1 секунды; перезапуск лишь доигрывает то, что изменилось.
Могут ли приложение и CLI делить один поисковый индекс?Да — FSearch отдаёт JSON-строки через Unix-сокет по пути ~/Library/Application Support/FSearch/fsearch.sock (или через stdio), причём индексом владеет первый запущенный процесс, а остальные просто следуют за ним.
What are similar projects?ripgrep, memex, meilisearch, fff, leviathan, sonic, tantivy, typesense
Size
3.2 MB
Stars
2.1K
Age
9d
Commits · 90 Days