Většina těchto odpovědí neprovádí fuzzy vyhledávání, jako to dělá vznešený text – mohou se shodovat s částí odpovědi, ale nedělají to hezké chování „prostě najdi všechna písmena v tomto pořadí“.
Myslím, že je to trochu blíž tomu, co chcete. Dal jsem dohromady speciální verzi cd ('fcd'), která používá fuzzy vyhledávání k nalezení cílového adresáře. Super jednoduché – stačí přidat toto do svého bashrc:
function joinstr { local IFS="$1"; shift; echo "$*"; }
function fcd { cd $(joinstr \* $(echo "$*" | fold -w1))* }
To přidá * mezi každé písmeno ve vstupu, takže pokud chci přejít například na,
/home/dave/results/sample/today
Můžu napsat cokoliv z následujícího:
fcd /h/d/r/spl/t
fcd /h/d/r/s/t
fcd /h/d/r/sam/t
fcd /h/d/r/s/ty
Použijeme-li první jako příklad, spustí se cd /*h*/*d*/*r*/*s*p*l*/*t*
a nechte shell vyřešit, co se vlastně shoduje.
Pokud je první znak správný a je zapsáno jedno písmeno z každého adresáře v cestě, najde to, co hledáte. Možná si to můžete přizpůsobit pro své potřeby? Důležitý je:
$(joinstr \* $(echo "$*" | fold -w1))*
který vytvoří fuzzy vyhledávací řetězec.
Může se vám hodit fzf. Je to univerzální fuzzy vyhledávač napsaný v Go, který lze použít s jakýmkoli seznamem věcí:soubory, procesy, historie příkazů, větve git atd.
Jeho instalační skript nastaví CTRL-T
klíčenka pro váš shell. Následující GIF ukazuje, jak to funguje.
Obvykle používám:
ls -R | grep -i [whatever I can remember of the file name]
Z adresáře výše, kde očekávám, že bude soubor - čím výše se ve stromu adresářů dostanete, tím pomaleji to půjde.
Když najdu přesný název souboru, použiji ho v find:
find . [discovered file name]
To by se dalo sbalit do jednoho řádku:
for f in $(ls --color=never -R | grep --color=never -i partialName); do find -name $f; done
(Našel jsem problém s aliasem ls a grep na "--color=auto")