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

时间:2012-02-24 22:47:19

标签: linux bash file-search

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

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

11 个答案:

答案 0 :(得分:59)

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

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

答案 1 :(得分:5)

fasd shell脚本也值得一看。

  

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

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

答案 2 :(得分:4)

这些答案中的大部分都不会像崇高文本那样进行模糊搜索 - 它们可能与答案的一部分匹配,但它们并不能做到“只是找到此顺序中的所有字母”行为。

我认为这更接近你想要的东西。我整理了一个特殊版本的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))*

创建模糊搜索字符串。

答案 3 :(得分:3)

我通常使用:

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

从上面我希望文件所在的目录开始 - 你在目录树中走得越高,这就越慢。

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

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”的问题)

答案 4 :(得分:3)

find . -iname '*foo*'

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

答案 5 :(得分:1)

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

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

很抱歉,如果您已经知道grep并且正在寻找更高级的内容。

答案 6 :(得分:1)

您可以执行以下操作

grep -iR "text to search for" .

其中“。”作为起点,所以你可以做点什么

grep -iR "text to search" /home/

这将使grep在/ home /下的每个文件中搜索给定文本,并列出包含该文本的文件。

答案 7 :(得分:1)

  

fd是一种简单,快速且用户友好的替代品。

GitHub项目页面的演示:

答案 8 :(得分:1)

您可以尝试使用bash补全功能的bash脚本的模糊目录更改工具c-(Cminus)。通过某种方式只能通过匹配访问的路径来限制它,但确实非常方便且非常快捷。

enter image description here

GitHub项目:whitebob/cminus

YouTube简介:https://youtu.be/b8Bem53Cz9A

答案 9 :(得分:0)

您可能想尝试一下 AGREP或使用TRE正则表达式库的其他内容。

答案 10 :(得分:0)

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

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

或者这是为了简化类似于glob的匹配:

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