Fuzzy file search in linux console

后端 未结 11 1074
忘掉有多难
忘掉有多难 2020-12-13 06:02

Does anybody know a way to perform a quick fuzzy search from linux console?

Quite often I come accross situation when I need to find a file in a project but I don\'t

相关标签:
11条回答
  • 2020-12-13 06:44

    You can do the following

    grep -iR "text to search for" .
    

    where "." being the starting point, so you could do something like

    grep -iR "text to search" /home/
    

    This will make grep search for the given text inside every file under /home/ and list files which contain that text.

    0 讨论(0)
  • 2020-12-13 06:45

    fd is a simple, fast and user-friendly alternative to find.

    Demo from the GitHub project page:

    0 讨论(0)
  • 2020-12-13 06:50

    You could use find like this for complex regex:

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

    Or this for simplier glob-like matches:

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

    Or you could also use find2perl (which is quite faster and more optimized than find), like this:

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

    If you just want to see how Perl does it, remove the | perl part and you'll see the code it generates. It's a very good way to learn by the way.

    Alternatively, write a quick bash wrapper like this, and call it whenever you want:

    #! /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
    

    Name this something like qsearch and then call it like this: qsearch . something

    0 讨论(0)
  • 2020-12-13 06:51
    find . -iname '*foo*'
    

    Case insensitive find of filenames containing foo.

    0 讨论(0)
  • 2020-12-13 06:57

    Most of these answers won't do fuzzy searching like sublime text does it -- they may match part of the answer, but they don't do the nice 'just find all the letters in this order' behavior.

    I think this is a bit closer to what you want. I put together a special version of cd ('fcd') that uses fuzzy searching to find the target directory. Super simple -- just add this to your bashrc:

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

    This will add an * between each letter in the input, so if I want to go to, for instance,

    /home/dave/results/sample/today
    

    I can just type any of the following:

    fcd /h/d/r/spl/t
    fcd /h/d/r/s/t
    fcd /h/d/r/sam/t
    fcd /h/d/r/s/ty
    

    Using the first as an example, this will execute cd /*h*/*d*/*r*/*s*p*l*/*t* and let the shell sort out what actually matches.

    As long as the first character is correct, and one letter from each directory in the path is written, it will find what you're looking for. Perhaps you can adapt this for your needs? The important bit is:

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

    which creates the fuzzy search string.

    0 讨论(0)
提交回复
热议问题