linux控制台中的模糊文件搜索

nab*_*nab 41 linux bash file-search

有没有人知道从linux控制台执行快速模糊搜索的方法?

当我需要在项目中找到文件但我不记得确切的文件名时,我常常遇到这种情况.在Sublime文本编辑器中,我将按Ctrl-P并键入名称的一部分,这将生成可供选择的文件列表.这是一个让我很满意的惊人功能.问题是在大多数情况下我必须通过ssh浏览远程机器上的控制台中的代码.所以我想知道是否有一个类似于Linux控制台的"Go Anywhere"功能的工具?

Jun*_*hoi 61

你可能会发现fzf很有用.这是一个用Go编写的通用模糊查找器,可以用于任何事物列表:文件,进程,命令历史,git分支等.

它的安装脚本将为CTRL-T您的shell 设置键绑定.以下GIF显示了它的工作原理.


dlo*_*nie 7

这些答案中的大多数不会像 sublime text 那样进行模糊搜索——它们可能会匹配答案的一部分,但它们并没有很好地“按此顺序查找所有字母”行为。

我认为这更接近你想要的。我整理了一个特殊版本的 cd ('fcd'),它使用模糊搜索来查找目标目录。超级简单——只需将其添加到您的 bashrc 中:

function joinstr { local IFS="$1"; shift; echo "$*"; }
function fcd { cd $(joinstr \* $(echo "$*" | fold -w1))* }
Run Code Online (Sandbox Code Playgroud)

这将在输入的每个字母之间添加一个 *,所以如果我想去,例如,

/home/dave/results/sample/today
Run Code Online (Sandbox Code Playgroud)

我可以只输入以下任何一项:

fcd /h/d/r/spl/t
fcd /h/d/r/s/t
fcd /h/d/r/sam/t
fcd /h/d/r/s/ty
Run Code Online (Sandbox Code Playgroud)

以第一个为例,这将执行cd /*h*/*d*/*r*/*s*p*l*/*t*并让 shell 找出实际匹配的内容。

只要第一个字符是正确的,并且在路径中的每个目录中写入一个字母,它就会找到你要找的东西。也许您可以根据自己的需要调整它?重要的一点是:

$(joinstr \* $(echo "$*" | fold -w1))*
Run Code Online (Sandbox Code Playgroud)

这将创建模糊搜索字符串。

  • 仅供参考,fzf(来自另一条评论)正是这样做的,用于命令历史记录、文件列表以及您想要输入的任何额外内容。奖励:实时更新、突出显示和渐进的异步索引(当您模糊匹配 30k 文件的目录时不会阻塞)。 (3认同)

mmr*_*tnt 5

我通常使用:

ls -R | grep  -i [whatever I can remember of the file name]
Run Code Online (Sandbox Code Playgroud)

从我期望文件所在的上面的目录开始 - 在目录树中位置越高,速度就越慢。

当我找到确切的文件名时,我在查找中使用它:

find . [discovered file name]
Run Code Online (Sandbox Code Playgroud)

这可以折叠成一行:

for f in $(ls --color=never -R | grep --color=never -i partialName); do find -name $f; done
Run Code Online (Sandbox Code Playgroud)

(我发现 ls 和 grep 别名为“--color=auto”有问题)


Chr*_*loe 5

胎儿酒精中毒综合症 shell脚本可能是值得考虑看看了.

fasd提供对POSIX shell的文件和目录的快速访问.它受到autojump,z和v等工具的启发.Fasd会跟踪您访问过的文件和目录,以便您可以在命令行中快速引用它们.

它与所有文件的完整查找略有不同,因为它只搜索最近打开的文件.但它仍然非常有用.


use*_*062 5

find . -iname '*foo*'
Run Code Online (Sandbox Code Playgroud)

不区分大小写查找包含foo.

  • @evanrmurphy:代码示例根本就是错误的,第一个参数“find”采用的是要搜索的文件夹;我冒昧地使用当前文件夹(`.`)作为示例来修复代码;OSX / GNU find 在这方面没有什么不同 (2认同)