Linuxコンソールからファジー検索をすばやく実行する方法を知っている人はいますか?
プロジェクトでファイルを検索する必要があるのに、正確なファイル名を覚えていない場合がよくあります。 Sublime text editor では、Ctrl-Pを押して名前の一部を入力すると、選択するファイルのリストが生成されます。それは私が非常に満足している驚くべき機能です。問題は、ほとんどの場合、リモートマシンのコンソールでsshを介してコードを参照する必要があることです。 Linuxコンソールの「どこでも実行」機能に似たツールはあるのでしょうか。
fzf が役立つかもしれません。これは、ファイル、プロセス、コマンド履歴、gitブランチなど、あらゆるリストで使用できるGoで記述された汎用のファジーファインダーです。
そのインストールスクリプトがセットアップされますCTRL-T
シェルのキーバインド。次のGIFは、それがどのように機能するかを示しています。
fasd シェルスクリプトもおそらく一見の価値があります。
fasd
は、POSIXシェルのファイルとディレクトリへの迅速なアクセスを提供します。これは、autojump、z、vなどのツールに触発されています。Fasdは、アクセスしたファイルとディレクトリを追跡するため、コマンドラインですばやく参照できます。
最近開いたファイルのみを検索するため、すべてのファイルの完全な検索とは少し異なります。しかし、それはまだ非常に便利です。
これらの回答のほとんどは、崇高なテキストのようにあいまい検索を実行しません-回答の一部と一致する可能性がありますが、ニースは「この順序ですべての文字を見つける」動作を実行しません。
これはあなたが望むものに少し近いと思います。ターゲットディレクトリを見つけるためにあいまい検索を使用する特別なバージョンのcd( 'fcd')を作成しました。超シンプル-これをbashrcに追加するだけです:
function joinstr { local IFS="$1"; shift; echo "$*"; }
function fcd { cd $(joinstr \* $(echo "$*" | fold -w1))* }
これにより、入力の各文字の間に*が追加されます。たとえば、
/home/dave/results/sample/today
次のいずれかを入力できます。
fcd /h/d/r/spl/t
fcd /h/d/r/s/t
fcd /h/d/r/sam/t
fcd /h/d/r/s/ty
最初の例を使用すると、これはcd /*h*/*d*/*r*/*s*p*l*/*t*
を実行し、実際に一致するものをシェルに分類させます。
最初の文字が正しく、パスの各ディレクトリから1文字が書き込まれている限り、探しているものが見つかります。おそらくあなたはあなたのニーズにこれを適応させることができますか?重要なビットは次のとおりです。
$(joinstr \* $(echo "$*" | fold -w1))*
あいまい検索文字列を作成します。
私は通常使用します:
ls -R | grep -i [whatever I can remember of the file name]
ファイルがあるはずの上のディレクトリから-ディレクトリツリーの上位に行くほど、これは遅くなります。
正確なファイル名が見つかったら、それを検索で使用します。
find . [discovered file name]
これは1行に折りたたむことができます。
for f in $(ls --color=never -R | grep --color=never -i partialName); do find -name $f; done
(「--color = auto」にエイリアスされているlsおよびgrepに問題があることがわかりました)
find . -iname '*foo*'
foo
を含むファイル名の大文字と小文字を区別しない検索。
fd は、シンプルで高速かつユーザーフレンドリーな検索の代替手段です。
GitHubプロジェクトページのデモ:
次のことができます
grep -iR "text to search for" .
どこ "。"出発点なので、次のようなことができます
grep -iR "text to search" /home/
これにより、grepは/ home /の下のすべてのファイル内の指定されたテキストを検索し、そのテキストを含むファイルをリストします。
私はあなたが端末にどれほど精通しているのかわかりませんが、これはあなたを助けることができます:
find | grep 'report'
find | grep 'report.*2008'
grep
をすでにご存知で、より高度なものを探していたらごめんなさい。
C ---(Cminus )を試すことができます。bashスクリプトのファジーdir変更ツールで、bash補完を使用します。訪問したパスのみを照合することで制限されますが、非常に便利で非常に高速です。
GitHubプロジェクト: whitebob/cminus
YouTubeの紹介: https://youtu.be/b8Bem53Cz9A
複雑な正規表現には、次のようなfindを使用できます。
find . -type f -regextype posix-extended -iregex ".*YOUR_PARTIAL_NAME.*" -print
または、これは単純なグロブのような一致の場合:
find . -type f -name "*YOUR_PARTIAL_NAME*" -print
または、次のように、find2Perl(findよりもかなり高速で最適化されている)を使用することもできます。
find2Perl . -type f -name "*YOUR_PARTIAL_NAME*" -print | Perl
Perlがどのように実行するかを確認したいだけの場合は、| Perl
部分と、それが生成するコードが表示されます。ちなみにこれはとても良い学習方法です。
または、次のような簡単なbashラッパーを作成し、いつでも呼び出すことができます。
#! /bin/bash
FIND_BASE="$1"
GLOB_PATTERN="$2"
if [ $# -ne 2 ]; then
echo "Syntax: $(basename $0) <FIND_BASE> <GLOB_PATTERN>"
else
find2Perl "$FIND_BASE" -type f -name "*$GLOB_PATTERN*" -print | Perl
fi
これにqsearch
のような名前を付けて、次のように呼び出します:qsearch . something
[〜#〜] agrep [〜#〜] または [〜#〜] tre [〜#〜] 正規表現ライブラリを使用する何かを試してみるとよいでしょう。