2012-02-24 4 views
33

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

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

ответ

54

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

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

+0

Какая тема? – potlee

+1

@potlee https://github.com/junegunn/seoul256.vim –

+0

звучит хорошо. Не могли бы вы сделать видео с YouTube? Я также хочу знать, как вы так быстро вставляете kill -9 . – anonymous

0

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

+2

Это очень расплывчатым, не объясняя, почему он хотел бы использовать регулярное выражение TRE. Что он предлагает, что ERE или PCRE нет? – jordanm

0

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

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

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

+5

Это не так, как вы используете find. Используйте 'find. -name 'report * 2008''. –

+0

@Chris Вам нужно процитировать ваш шаблон поиска, чтобы предотвратить расширение оболочки из glob. +1 за сделанную точку. – jordanm

+0

@Chris Это не то, что я искал, но что не так с 'find | grep '. * 2008''? – nab

1

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

grep -iR "text to search for" . 

где "" являясь отправной точкой, так что вы могли бы сделать что-то вроде

grep -iR "text to search" /home/ 

Это сделает поиск Grep для данного текста внутри каждого файла в каталоге/дома/и список файлов, которые содержат этот текст.

3

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

ls -R | grep -i [whatever I can remember of the file name] 

Из каталога выше, где я ожидаю, что файл будет - чем выше вы идете в дереве каталогов, тем медленнее это будет идти.

Когда я найти точное имя файла, я использую его в находке:

find . [discovered file name] 

Это может быть свернуты в одну строку:

for f in $(ls --color=never -R | grep --color=never -i partialName); do find -name $f; done 

(я нашел проблему с Лс Grep будучи совмещенным с «--color = авто»)

+0

Если найденный объект может быть скрыт, вы можете чередовать команду: 'ls -laR | grep -i [нечеткое имя файла] '(добавлено l (длинный формат) и (все файлы, включая эти пунктирные файлы) до R). – Semo

0

Вы можете использовать найти, как это для сложных выражений:

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

Или это для проще Глоб подобных матчей:

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

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

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

Если вы просто хотите посмотреть, как это делает Perl, удалите часть | perl, и вы увидите код, который он генерирует. Кстати, это очень хороший способ учиться.

В качестве альтернативы, быстро написать Баш оболочку, как это и назвать его всякий раз, когда вы хотите:

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

5

fasd сценарий оболочки вероятно, стоит взглянуть тоже.

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

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

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* и пусть Шелла, что на самом деле соответствует.

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

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

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

+2

FYI, fzf (из другого комментария) делает именно это, для истории команд, списка файлов и любой дополнительной вещи, которую вы хотите вставить в нее. Бонус: живое обновление, подсветка и постепенное индексирование асинхронных (не блокируется, когда вы нечетко сопоставляете каталог из 30k файлов). – chenglou

+0

Согласен! После написания ответа я наткнулся на fzf где-то по пути, и теперь это то, что я использую. Отличный инструмент. – dlonie

1
find . -iname '*foo*' 

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

+0

Я не думаю, что это правильное использование 'find'. – evanrmurphy

+1

Правильное использование как в ...? – user1338062

+0

Когда я запускаю это, он терпит неудачу с 'find: wrong option - i'. Я сейчас на Mac. Возможно, 'find' работает по-разному между Mac и Linux. – evanrmurphy

0

fd - простая, быстрая и удобная альтернатива для поиска.

Demo на странице проекта GitHub:

Смежные вопросы