web-dev-qa-db-ja.com

Linuxコンソールでのファジーファイル検索

Linuxコンソールからファジー検索をすばやく実行する方法を知っている人はいますか?

プロジェクトでファイルを検索する必要があるのに、正確なファイル名を覚えていない場合がよくあります。 Sublime text editor では、Ctrl-Pを押して名前の一部を入力すると、選択するファイルのリストが生成されます。それは私が非常に満足している驚くべき機能です。問題は、ほとんどの場合、リモートマシンのコンソールでsshを介してコードを参照する必要があることです。 Linuxコンソールの「どこでも実行」機能に似たツールはあるのでしょうか。

42
nab

fzf が役立つかもしれません。これは、ファイル、プロセス、コマンド履歴、gitブランチなど、あらゆるリストで使用できるGoで記述された汎用のファジーファインダーです。

そのインストールスクリプトがセットアップされますCTRL-Tシェルのキーバインド。次のGIFは、それがどのように機能するかを示しています。

62
Junegunn Choi

fasd シェルスクリプトもおそらく一見の価値があります。

fasdは、POSIXシェルのファイルとディレクトリへの迅速なアクセスを提供します。これは、autojump、z、vなどのツールに触発されています。Fasdは、アクセスしたファイルとディレクトリを追跡するため、コマンドラインですばやく参照できます。

最近開いたファイルのみを検索するため、すべてのファイルの完全な検索とは少し異なります。しかし、それはまだ非常に便利です。

5
Chris Farmiloe

これらの回答のほとんどは、崇高なテキストのようにあいまい検索を実行しません-回答の一部と一致する可能性がありますが、ニースは「この順序ですべての文字を見つける」動作を実行しません。

これはあなたが望むものに少し近いと思います。ターゲットディレクトリを見つけるためにあいまい検索を使用する特別なバージョンの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))*

あいまい検索文字列を作成します。

4
dlonie

私は通常使用します:

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に問題があることがわかりました)

4
mmrtnt
find . -iname '*foo*'

fooを含むファイル名の大文字と小文字を区別しない検索。

3
user1338062

fd は、シンプルで高速かつユーザーフレンドリーな検索の代替手段です。

GitHubプロジェクトページのデモ:

2
user1338062

次のことができます

grep -iR "text to search for" .

どこ "。"出発点なので、次のようなことができます

grep -iR "text to search" /home/

これにより、grepは/ home /の下のすべてのファイル内の指定されたテキストを検索し、そのテキストを含むファイルをリストします。

1
Snake007uk

私はあなたが端末にどれほど精通しているのかわかりませんが、これはあなたを助けることができます:

find | grep 'report'
find | grep 'report.*2008'

grepをすでにご存知で、より高度なものを探していたらごめんなさい。

1
Adiel Mittmann

C ---(Cminus )を試すことができます。bashスクリプトのファジーdir変更ツールで、bash補完を使用します。訪問したパスのみを照合することで制限されますが、非常に便利で非常に高速です。

enter image description here

GitHubプロジェクト: whitebob/cminus

YouTubeの紹介: https://youtu.be/b8Bem53Cz9A

1
whitebob

複雑な正規表現には、次のような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

0
Yanick Girouard

[〜#〜] agrep [〜#〜] または [〜#〜] tre [〜#〜] 正規表現ライブラリを使用する何かを試してみるとよいでしょう。

0
Tony Laidig