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