在Linux控制台中模糊文件search

有没有人知道从Linux控制台执行快速模糊search的方法?

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

Solutions Collecting From Web of "在Linux控制台中模糊文件search"

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

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

fasd shell脚本也可能值得一看。

fasd提供了对POSIX shell的文件和目录的快速访问。 它受到诸如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*并让shell理清实际匹配的内容。

只要第一个字符是正确的,并且从路径中每个目录中的一个字母被写入,它就会找到你正在寻找的东西。 也许你可以适应你的需要? 重要的是:

 $(joinstr \* $(echo "$*" | fold -w1))* 

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

我通常使用:

 ls -R | grep -i [whatever I can remember of the file name] 

从我期望的文件所在的目录 – 在目录树中越往上走,这个就越慢。

当我找到确切的文件名,我用它找到:

 find . [discovered file name] 

这可以合并成一行:

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

(我发现一个问题与ls和grep别名为“–color = auto”)

您可以执行以下操作

 grep -iR "text to search for" . 

哪里“。” 作为出发点,所以你可以做类似的事情

 grep -iR "text to search" /home/ 

这将使grep在/ home /列表文件中包含该文本的每个文件内搜索给定的文本。

您可能想尝试使用TRE正则表达式库的AGREP或其他东西。

我不知道你对终端有多熟悉,但这可以帮助你:

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

对不起,如果你已经知道grep并正在寻找更先进的东西。

你可以像这样使用复杂的正则表达式:

find . -type f -regextype posix-extended -iregex ".*YOUR_PARTIAL_NAME.*" -print

或者这个简单的glob-like匹配:

find . -type f -name "*YOUR_PARTIAL_NAME*" -print

或者你也可以使用find2perl(比查找更快,更优化),如下所示:

find2perl . -type f -name "*YOUR_PARTIAL_NAME*" -print | perl

如果你只是想看看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 qsearch . something

 find . -iname '*foo*' 

不区分大小写查找包含foo的文件名。