简体中文
Кросс-платформенный индексатор и поисковик файловой системы, сочетающий в себе преимущества find
, locate
и Everything
, а также поиск по содержимому файла. Работает на Linux, macOS и Windows.
Инвертированный индекс, технология plocate
, которая делает поиск практически постоянным, реализована в v0.4.0
и выше . К сожалению, v0.4
недостаточно протестирована, и на данный момент это v0.3.x
Кроме того, все демонстрации в README выполнены для v0.3.0
. Однако для персональных компьютеров, на которых обычно имеется менее 3 МБ файлов, инвертированный индекс не имеет большого значения.
Поиск по контенту не индексируется. Индексирование содержимого файла будет продолжено, если этот репозиторий достигнет 512 звезд, поэтому нажмите кнопку со звездочкой, если приложение окажется для вас полезным или если вы найдете его интересным!
(Подробнее об этом здесь.)
Этот README посвящен приложению CLI. Информацию о интерфейсе с графическим интерфейсом см. в разделе SearchEverywhere. (тоже довольно нестабильно)
Работа над этим проектом началась с августа 2022 года, но не была опубликована до апреля 2023 года из-за множества ошибок. Однако в настоящее время все еще может быть бесчисленное количество ошибок, даже в стабильной версии ( v0.3.x
).
Единственная зависимость во время выполнения — PCRE2, а размер полностью статического исполняемого файла составляет всего 2,5 МБ (удаленный).
Первый индексатор файлов Libre для macOS и Windows!?
/System/Volumes/Data
которую find
трюки. Скриншот для macOS и Windows соответственно:
updatedb
без полномочий root (только SSD) В отличие locate
, для восстановления индекса файловой системы НЕ требуются права root (или администратора в Windows). Сетугида тоже нет.
Для твердотельных накопителей настроен пул потоков для одновременного чтения каталогов, что значительно увеличивает скорость чтения.
Для жестких дисков эту функцию следует отключить, поскольку многопоточный ввод-вывод не дает видимого прироста производительности из-за их вращающейся природы.
Необходимость включения многопоточного updatedb
можно переключать для каждого пути.
На рисунке видно, что orient
может просканировать 810000 файлов за 1 секунду с отключенным кэшем , но используемый диск довольно высокого класса. Однако отнеситесь к этому с недоверием.
Как и updatedb
, тот же пул потоков также используется для сопоставления содержимого. Нечеткое сопоставление hello world
из дерева исходного кода ядра Linux из 75 000 файлов заняло 5,5 секунды при удалении кеша и 1,5 секунды при удалении кеша.
(отнеситесь к этому с недоверием: 16 процессоров Intel i7 11800H и твердотельный накопитель NVMe)
В Windows сопоставление содержимого происходит значительно медленнее , что является комбинированным эффектом преобразования UTF8 в UTF16, отсутствия эффективного сопоставления памяти ядра (
mmap(2)
) и раздутой и неэффективной природы Windows.
Прощай, find ... | xargs grep ...
и find ... -a -exec grep ...
find
-подобный синтаксис Как показано ниже, orient
также реализует большую часть совпадений find
, что позволяет пользователям легко ознакомиться с существующим опытом использования find
, а также повышает универсальность приложения.
В отличие от Everything
, в котором родительский элемент жесткого кода соответствует только сопоставлению строк, в orient
-updir -downdir
можно применять к любому предикату.
Кроме того, -downdir
почти 0 накладных расходов, а -updir
делает поиск еще быстрее за счет кэширования последних совпадений.
Соответствующий родитель:
Соответствующие дети:
Линукс | Окна | macOS | Андроид | Лицензия | |
---|---|---|---|---|---|
Everything | ?НЕТ | ?ДА | ?НЕТ | ?НЕТ | Собственный |
find | ?ДА | ?НЕТ | ?НЕТ | ?НЕТ | лицензия GPLv3 |
fsearch | ?ДА | ?НЕТ | ?НЕТ | ?НЕТ | лицензия GPLv2 |
locate | ?ДА | ?НЕТ | ?НЕТ | ?НЕТ | лицензия GPLv3 |
orient | ?ДА | ?ДА | ?ДА | ?НЕТ | лицензия GPLv3 |
Продолжение таблицы
-and -or | Инвертировать индекс | Сопоставить родительский элемент | графический интерфейс | интерфейс командной строки | |
---|---|---|---|---|---|
Everything | ?ДА | ?НЕТ | Частичный | ?ДА | ? |
find | ?ДА | ?НЕТ | ?НЕТ | ?НЕТ | ?ДА |
fsearch | ?ДА | ?НЕТ | Частичный | ?ДА | ?НЕТ |
locate | ?НЕТ | ?ДА | ?НЕТ | ?НЕТ | ?ДА |
orient | ?ДА | ?ДА | ?ДА | ?ДА | ?ДА |
Примечания:
Everything
все результаты CLI предварительно предварительно оформлены , что делает его очень трудным для использования в сочетании с другими инструментами, следовательно, ? лицо.eVeRyThInG
, ПРЕДОСТАВЛЯЕТСЯ ТОЛЬКО SDK!!! НАШ ДОРОГОЙ ЛИДЕР РИЧАРД СТАЛМАН УДАРАЕТ ЯДЕРНУЮ ЯДЕРУ!!!Что еще хуже,
Everything SDK
наполнен глобальными состояниями.?
find
-like Пользователи, знакомые с find
могут начать с предикатов, совместимых с orient
find
, таких как -regex
, -lname
, -okdir
и других.
Обратите внимание, что предикаты orient
иногда являются расширенным набором своих аналогов find
, например, -quit
опционально принимает целочисленный аргумент, означающий, сколько результатов может быть получено перед выходом. Его значение по умолчанию равно 1, поэтому при использовании -quit
без аргументов оно не имеет отличий от значения find
.
Для предикатов, специфичных для orient
, предоставляется только синтаксис orient
-style, см. ниже.
# 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
не имеет столько (уникальных) предикатов, как find
. Вместо этого orient
использовать синтаксис -PRED --ARG
, предоставляющий несколько схем сопоставления одному предикату, что повышает возможность повторного использования кода.
-name
-bregex
-strstr
-fuzz
--ignore-case
(кроме -fuzz
) --full
--readlink
-content-{strstr,fuzz,regex}
--ignore-case
(кроме fuzz) --blocked
--allow-binary
-size
-{a,m,c}{time,min}
-inum
+
или -
Многие find
что совместимые предикаты на самом деле являются псевдонимами, например
-lname
идентично -name --readlink
-regex
- -bregex --ignore-case
( b
означает базовое имя)
-samefile
по сути является -inode
, поскольку -inode
также принимает имя файла
Также возможно смешивать два синтаксиса, хотя это не рекомендуется.
например-iname --full
или-anewer +5
Ниже приведены несколько простых примеров. Подробнее о том, как их использовать, смотрите здесь.
# 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
Благодаря введению предикатов-модификаторов можно «сделать что-то» перед распространением на другие предикаты, что и делают -updir
и -downdir
: они соответствуют родительскому элементу файлов и дочерним элементам каталогов.
С помощью модификаторов -updir -downdir
можно применить к любому предикату в orient
, в отличие от Everything
, который жестко соответствует родительскому коду только для сопоставления строк.
Любой предикат включает в себя рекурсивное использование -updir -downdir
.
Кроме того, -downdir
почти 0 накладных расходов, а -updir
делает поиск еще быстрее за счет кэширования последних совпадений.
Еще несколько модификаторов включают -prunemod
, -quitmod
и -not
. Бывший:
# 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 "
Поскольку приложение представляет собой интерфейс командной строки, просто скачайте исполняемый файл вашей системы, и оно должно работать.
В Linux для работы
-user -nouser -group -nogroup
требуется glibc.
К сожалению, версия macOS ARM отсутствует, поскольку у меня нет такой машины? Не стесняйтесь сообщать, работает ли это по вопросу или обсуждению.
В настоящее время это приложение слишком мало протестировано, чтобы его можно было выпускать для распространения.
Кстати, сначала может быть выпущен для Arch AUR.
Сборку из исходного кода рекомендуется на ранней стадии выпуска. Попробуйте! (Требуется для v0.4.0
)
Или, что еще лучше, создайте и orient
, и SearchEverywhere. При создании SearchEverywhere
также создается orient
. Построить зависимости:
Помимо CMake
, все зависимости могут быть автоматически загружены CMake.
Также возможно использование установленного, если вы уже установили некоторые из них в свою систему, переключив эти параметры конфигурации ниже.
Настроить параметры:
ORIE_TEST
: создание наборов тестов GoogleTest.ORIE_SYSTEM_PCRE2
: использовать системную библиотеку PCRE2 вместо компиляции новой.ORIE_LINK_STATIC
: Статически ориентированный исполняемый файл.ORIE_SYSTEM_RAPIDFUZZ
: использовать системную библиотеку RapidFuzz (только заголовок) Замените OPTION
ниже включенными опциями и выполните следующие команды:
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
При генерации конфигурации по умолчанию жестко запрограммированы некоторые отправные точки и разрешено многопоточное чтение для всех из них, что неоптимально для ротационных жестких дисков.
Если вы используете жесткие диски, при первом запуске orient
выполните следующие действия:
orient -updatedb
Ctrl-C
~/.config/orie/default.txt
или %APPDATA%.oriedefault.txt
ROOT
, удалите поле SSD
, если какой-либо из этих путей на самом деле не находится на SSD.ROOT "/path/to/mountpoint"
или просто не индексируйте его с помощью IGNORED "/path/to/mountpoint"
. В Linux /sys/block/sda/queue/rotational
предоставляет информацию о том, является ли диск ротационным, чего, к сожалению (но ожидаемо), нет в macOS и Windows.
В будущем выпуске корневые точки будут получены из /etc/mtab
и /sys/.../rotational
, которые автоматически настраивают корневые пути в Linux и macOS.
ЯБЛОКО ТАК КРУТО! ОНИ ДОЛЖНЫ БЫТЬ ОСНАЩЕНЫ СВОИ МАКБУКИ ЛУЧШИМИ ЖЕСТКИМИ ДИСКАМИ В МИРЕ И ОПРЕДЕЛЕННО НЕ ВРАЩАЮЩИЕСЯ!
Серия предикатов exec
реализована, но не протестирована в Windows.
А умеренный опыт разработки программного обеспечения подскажет, что непроверенные функции наверняка будут содержать ошибки, а то и полностью откажутся.
Существует ряд непроверенных функций, причем exec
для Windows — единственная функция, указанная в списке функций.
Другие непроверенные функции перечислены в списке TODO, но не в списке функций, а также указаны причины, по которым они не протестированы.
find
В основном глобальные варианты:
-context
(контекст SELinux)-printf -fprintf -ls -fls
(Формат печати)-newerXY
-mindepth
-maxdepth
-H -L -P
(символическая ссылка после глобальных опций)-D
(отладка)-O
(уровень оптимизации)
orient
имеет собственный оптимизатор, аналогичныйfind -O3
-regextype
(жестко закодированный PCRE2)-warn -nowarn
-d -depth
(поиск сначала в глубину)
orient
может искать только по индексу.-delete
не затрагивается, в отличие отfind
.
-files0-from
-mount -xdev -xautofs
(не спускаться в монтирования)-help -version
В последнее время в центре работы будет документация.
Отчеты об ошибках и запросы на функции в любом случае по-прежнему принимаются в GitHub Issues Tracker этого репозитория.
Подробности см. в списке TODO.
dirent
порт Unix для WindowsЗдесь сильно изменено для символической ссылки и (поддельного) устройства, поддержки сокетов, поэтому оно помещается непосредственно в исходный код, а не в модуль.