有人知道从linux控制台执行快速模糊搜索的方法吗?
当我需要在项目中找到文件但我不记得确切的文件名时,我经常遇到这种情况。在Sublime text editor中,我会按Ctrl-P并键入名称的一部分,这将生成可供选择的文件列表。这是一个让我很满意的惊人功能。问题是在大多数情况下我必须通过ssh浏览远程机器上的控制台中的代码。所以我想知道是否有一个类似于Linux控制台的“Go Anywhere”功能的工具?
答案 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)
答案 8 :(得分:1)
您可以尝试使用bash补全功能的bash脚本的模糊目录更改工具c-(Cminus)。通过某种方式只能通过匹配访问的路径来限制它,但确实非常方便且非常快捷。
GitHub项目:whitebob/cminus
YouTube简介:https://youtu.be/b8Bem53Cz9A
答案 9 :(得分:0)
答案 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