简体中文
find
、 locate
、 Everything
のメリットに加え、ファイル コンテンツ検索を組み合わせた、クロスプラットフォームのファイル システム インデクサーおよびサーチャー。 Linux、macOS、Windows で動作します。
逆インデックスは、検索をほぼ一定時間で実行できるplocate
の背後にある技術で、 v0.4.0
以降に実装されています。残念ながら、 v0.4
十分にテストされておらず、現在のリリースはv0.3.x
です。また、README 内のすべてのデモはv0.3.0
で行われています。ただし、ファイルが通常 3M 未満であるパーソナル コンピュータの場合、転置インデックスはそれほど大きな違いはありません。
コンテンツ検索にはインデックスが付けられません。このリポジトリが 512 スターに達すると、ファイル コンテンツのインデックス作成が行われるため、アプリが役立つことがわかった場合、または興味深いと思った場合は、スター ボタンを押してください。
(これについて詳しくは、こちらをご覧ください。)
この README は CLI アプリケーションに関するものです。 GUI フロントエンドについては、「SearchEverywhere」を参照してください。 (これもかなり不安定)
このプロジェクトは 2022 年 8 月から作業が開始されましたが、無数のバグのため 2023 年 4 月まで公開されませんでした。ただし、安定版 ( v0.3.x
) であっても、現時点ではまだ無数のバグが存在する可能性があります。
ランタイム依存関係は PCRE2 のみであり、完全に静的な実行可能ファイルのサイズはわずか 2.5MiB (ストリップされた状態) です。
macOS と Windows 上で初の Libre File Indexer が登場!?
find
macOS ファームリンク/System/Volumes/Data
を無視しますそれぞれ macOS と Windows のスクリーンショット:
updatedb
(SSD のみ) locate
とは異なり、ファイルシステム インデックスの再構築には root 権限 (Windows では管理者) は必要ありません。セツギッドもありません。
SSD の場合、ディレクトリの同時読み取り用にスレッド プールがセットアップされ、読み取り速度が大幅に高速化されます。
HDD の場合、マルチスレッド IO は回転する性質のため目に見えるパフォーマンスの向上をもたらさないため、この機能は無効にする必要があります。
マルチスレッドupdatedb
を有効にするかどうかは、パスごとに切り替えることができます。
この図は、 orient
キャッシュを削除した状態で 1 秒以内に 810,000 個のファイルをスキャンできることを示していますが、使用されているディスクはかなりハイエンドのものです。ただし、割り引いて考えてください。
updatedb
と同様に、同じスレッド プールがコンテンツの一致にも使用されます。 75000 ファイルの Linux カーネル ソース ツリーからのファジー マッチングのhello world
は、キャッシュがドロップされた場合は 5.5 秒かかり、キャッシュがある場合は 1.5 秒かかりました。
(割り引いて考えてください。16x Intel i7 11800H および NVMe SSD)
Windows では、UTF8 から UTF16 への変換、効率的なカーネル メモリ マッピング (
mmap(2)
) の欠如、および Windows の肥大化して非効率な性質の複合的な影響により、コンテンツ マッチングが大幅に遅くなります。
さようなら、 find ... | xargs grep ...
そしてfind ... -a -exec grep ...
find
のような構文以下に示すように、 orient
find
の一致の大部分も実装しているため、ユーザーはfind
使用する際の既存の経験に簡単に慣れることができると同時に、アプリの多用途性も向上します。
親一致を文字列一致のみにハードコードするEverything
とは異なり、 orient
では、 -updir -downdir
任意の述語に適用できます。
また、 -downdir
オーバーヘッドがほぼ 0 で、 -updir
最近の一致をキャッシュすることで検索をさらに高速化します。
一致する親:
マッチングする子供たち:
Linux | 窓 | macOS | アンドロイド | ライセンス | |
---|---|---|---|---|---|
Everything | ?いいえ | ?はい | ?いいえ | ?いいえ | 独自の |
find | ?はい | ?いいえ | ?いいえ | ?いいえ | GPLv3 |
fsearch | ?はい | ?いいえ | ?いいえ | ?いいえ | GPLv2 |
locate | ?はい | ?いいえ | ?いいえ | ?いいえ | GPLv3 |
orient | ?はい | ?はい | ?はい | ?いいえ | GPLv3 |
続きの表
-and -or | 索引を反転する | 親の一致 | GUI | CLI | |
---|---|---|---|---|---|
Everything | ?はい | ?いいえ | 部分的 | ?はい | ? |
find | ?はい | ?いいえ | ?いいえ | ?いいえ | ?はい |
fsearch | ?はい | ?いいえ | 部分的 | ?はい | ?いいえ |
locate | ?いいえ | ?はい | ?いいえ | ?いいえ | ?はい |
orient | ?はい | ?はい | ?はい | ?はい | ?はい |
注:
Everything
CLI ではすべての結果が整形されているようで、他のツールと組み合わせて使用するのが非常に困難です。顔。eVeRyThInG
独自のものであり、SDK のみが提供されます。我らの親愛なるリーダー、リチャード・ストールマンが核を撃つだろう!!!さらに悪いことに、
Everything SDK
はグローバル状態でいっぱいです。
find
のような構文を使用するfind
に慣れているユーザーは、 -regex
、 -lname
、 -okdir
などのorient
互換性のある述語をfind
してすぐに始めることができます。
orient
述語は、対応するfind
のスーパーセットである場合があることに注意してください。 -quit
オプションで、終了する前に生成できる結果の数を意味する整数の引数を受け取ります。デフォルト値は 1 なので、引数なしで-quit
使用する場合、 find
の場合と違いはありません。
orient
に固有の述語については、 orient
スタイルの構文のみが提供されます。以下を参照してください。
# 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
ほど多くの (固有の) 述語がありません。代わりに、 -PRED --ARG
構文を使用しorient
、単一の述語に複数の一致スキームを与え、コードの再利用性を高めます。
-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
ベース名を表します)
-inode
ファイル名も受け入れるため、 -samefile
基本的に-inode
です。
2 つの構文を混合することもできますが、推奨されません。
-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
修飾子述語の導入により、他の pred に伝播する前に「何かを行う」ことが可能になります。これはまさに-updir
と-downdir
行うことです。これらはファイルの親とディレクトリの子を照合します。
修飾子を使用すると、 -updir -downdir
ハードコードされた親一致が文字列一致のみに一致するEverything
は異なり、 orient
の任意の述語に適用できます。
どの述語にも、 -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 "
アプリケーションは CLI であるため、システムの実行可能ファイルを取得するだけで動作します。
Linux では、
-user -nouser -group -nogroup
機能するためには glibc が必要です。
残念ながら、そのようなマシンを持っていないため、macOS ARM バージョンがありません。問題やディスカッションに関して機能するかどうか、お気軽に報告してください。
現在、このアプリはテストがほとんど行われていないため、ディストリビューションにリリースできません。
ちなみに最初に Arch AUR にリリースされるのは 5 月です。
リリースの初期段階では、ソースからビルドすることをお勧めします。試してみてください! ( 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
デフォルトの構成生成では、いくつかの開始点がハードコーディングされ、すべての開始点でマルチスレッド読み取りが有効になりますが、これは回転ハードディスクにとっては最適ではありません。
HDD を使用する場合は、 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 でルート パスが自動構成されます。
アップルはとてもクールです! Macbook には世界最高のハード ディスクが装備されている必要があり、間違いなく回転しません。
exec
シリーズの述語は Windows 上に実装されていますが、テストされていません。
そして、ある程度のソフトウェア エンジニアリングの経験があれば、テストされていない機能には、完全に失敗しないにしても、間違いなくエラーが含まれていることがわかります。
未テストの機能が多数ありますが、実際に機能リストにリストされているのは Windows 上のexec
だけです。
他の未テストの機能は、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
インデックスに従ってのみ検索できます。ただし、find
とは異なり、-delete
は影響を受けません。
-files0-from
-mount -xdev -xautofs
(マウントに降下しない)-help -version
最近はドキュメントが作品の中心になります。
バグレポートと機能リクエストは、このリポジトリの GitHub Issues Tracker で引き続き受け付けられます。
詳しくはTODOリストをご覧ください。
dirent
ポートここではシンボリックリンクと(偽の)デバイス、ソケットのサポートのために大幅に変更されているため、モジュールではなくソースに直接配置されています。