Подтвердить что ты не робот

Нечеткий поиск файлов в консоли linux

Кто-нибудь знает способ быстро выполнить нечеткий поиск из консоли linux?

Довольно часто я сталкиваюсь с ситуацией, когда мне нужно найти файл в проекте, но я не помню точное имя файла. В Возвышенный текстовый редактор Я бы нажал Ctrl-P и набрал часть имени, из которого будет выведен список файлов для выбора. Это удивительная особенность, в которой я доволен. Проблема в том, что в большинстве случаев мне приходится просматривать код в консоли на удаленных машинах через ssh. Так что мне интересно, есть ли инструмент, похожий на "Go Anywhere" для консоли Linux?

4b9b3361

Ответ 1

Вы можете найти fzf. Это универсальный нечеткий поисковик, написанный в Go, который может использоваться с любым списком вещей: файлы, процессы, история команд, ветки git и т.д.

Его установка script установит ключевое слово CTRL-T для вашей оболочки. Следующий GIF показывает, как он работает.

Ответ 2

fasd shell script, вероятно, стоит взглянуть и на него.

fasd предлагает быстрый доступ к файлам и каталогам для оболочек POSIX. Он вдохновлен инструментами, такими как autojump, z и v. Fasd отслеживает файлы и каталоги, к которым вы обращались, чтобы вы могли быстро ссылаться на них в командной строке.

Он немного отличается от полной находки всех файлов, поскольку он только ищет недавно открытые файлы. Однако это все еще очень полезно.

Ответ 3

Большинство из этих ответов не будут делать нечеткий поиск, как это делает возвышенный текст - они могут соответствовать части ответа, но они не делают приятного "просто найти все буквы в этом порядке".

Я думаю, что это немного ближе к тому, что вы хотите. Я собрал специальную версию 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*, и пусть оболочка выберет то, что на самом деле соответствует.

До тех пор, пока первый символ верен, и одна буква из каждой директории в пути написана, она найдет то, что вы ищете. Возможно, вы можете адаптировать это для своих нужд? Важный бит:

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

который создает строку нечеткого поиска.

Ответ 4

Обычно я использую:

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" )

Ответ 5

Вы можете сделать следующее

grep -iR "text to search for" .

где "." являясь отправной точкой, поэтому вы можете сделать что-то вроде

grep -iR "text to search" /home/

Это приведет к тому, что grep будет искать данный текст внутри каждого файла в/home/и списке файлов, содержащих этот текст.

Ответ 6

Возможно, вы захотите попробовать AGREP или что-то еще, что использует TRE Библиотека регулярных выражений.

Ответ 7

Я не знаю, насколько вы знакомы с терминалом, но это может вам помочь:

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

Извините, если вы уже знаете grep и искали что-то более продвинутое.

Ответ 8

Вы можете использовать find для этого сложного регулярного выражения:

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

Или это для более простых glob-подобных совпадений:

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

Или вы также можете использовать find2perl (который выполняется быстрее и более оптимизирован, чем поиск), например:

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

Ответ 9

find . -iname '*foo*'

Нечувствительный к регистру поиск имен файлов, содержащих foo.