2012-02-24 17 views
33

Czy ktoś zna sposób szybkiego wyszukiwania rozmytego z poziomu konsoli systemu Linux?Wyszukiwanie plików rozmytych w konsoli linuksowej

Dosyć często dochodzę do sytuacji, gdy potrzebuję znaleźć plik w projekcie, ale nie pamiętam dokładnej nazwy pliku. W Sublime text editor nacisnąłem Ctrl-P i wpisałem część nazwy, która wyświetli listę plików do wyboru. To niesamowita funkcja, z której jestem całkiem zadowolony. Problem polega na tym, że w większości przypadków muszę przeglądać kod w konsoli na zdalnych maszynach przez ssh. Zastanawiam się, czy istnieje narzędzie podobne do funkcji "Go Anywhere" na konsolę Linux?

Odpowiedz

54

Może Ci się przydać fzf. Jest to wyszukiwarka fuzzy ogólnego przeznaczenia napisana w Go, która może być używana z dowolną listą rzeczy: plikami, procesami, historią poleceń, gałęziami git, itp.

W swoim skrypcie instalacyjnym zostanie ustawiona keybinding dla twojej powłoki. Poniższy GIF pokazuje, jak to działa.

+0

jaki to jest temat? – potlee

+1

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

+0

brzmi dobrze. Czy możesz zrobić o tym film na youtube? Chcę również wiedzieć, jak szybko wstawiasz kill -9 . – anonymous

0

Może chcesz wypróbować AGREP lub coś innego, co używa biblioteki wyrażeń regularnych TRE.

+2

To bardzo ogólnikowe, nie wyjaśniając dlaczego chciałby używać TRE regex. Co oferuje ta technologia ERE lub PCRE? – jordanm

0

Nie wiem jak ty są znane z terminalem, ale to może pomóc:

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

Niestety, jeśli już wiesz grep i szukaliśmy czegoś bardziej zaawansowanego.

+5

To naprawdę nie jest sposób wyszukiwania. Użyj 'find. -name 'report * 2008''. –

+0

@Chris Musisz podać wzór wyszukiwania, aby zapobiec rozszerzeniu globu przez powłokę. +1 za wykonany punkt. – jordanm

+0

@Chris Nie tego szukałem ale co jest nie tak z 'find | grep 'report. * 2008' 'form? – nab

1

gdzie można zrobić następujące

grep -iR "text to search for" . 

"" jako punkt wyjścia, więc można zrobić coś takiego

grep -iR "text to search" /home/ 

uczyni wyszukiwanie grep dla danego tekstu wewnątrz każdego pliku w katalogu/home plików/i listy, które zawierają ten tekst.

3

Zwykle używam:

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

z katalogu powyżej, gdzie spodziewam plik się - im wyżej idziesz w drzewie katalogów, tym wolniej to pójdzie.

Kiedy znaleźć dokładną nazwę pliku, używam go w znalezisku:

find . [discovered file name] 

To może być zwinięte w jedną linię:

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

(znalazłem problem z ls i grep jest aliasem "--color = auto")

+0

Jeśli szukany element może być ukryty, możesz na przemian wpisać polecenie: 'ls -laR | grep -i [nazwa pliku rozmytego] '(dodano l (długi format) i a (wszystkie pliki, w tym pliki kropkowane) przed R). – Semo

0

można użyć znaleźć tak do kompleksowego regex:

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

Albo to na prostszy Glob-jak zapałki:

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

Albo można też wykorzystać find2perl (co jest dość szybciej i bardziej zoptymalizowane niż znaleźć), na przykład:

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

Jeśli chcesz zobaczyć, jak działa Perl, usuń część | perl, a zobaczysz wygenerowany kod. To jest bardzo dobry sposób na naukę przy okazji.

Alternatywnie, napisać krótki bash opakowanie takiego, i nazywają to kiedy chcesz:

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

Nazwa to coś qsearch a następnie nazwać tak: qsearch . something

5

fasd skrypt jest prawdopodobnie warto się też przyjrzeć.

fasd oferuje szybki dostęp do plików i katalogów dla powłok POSIX. Inspirują go narzędzia takie jak autojump, z i v. Fasd śledzi pliki i katalogi, do których masz dostęp, dzięki czemu możesz szybko odwoływać się do nich w linii poleceń.

Różni się trochę od pełnej znalezisku wszystkich plików, ponieważ tylko przeszukuje ostatnio otwieranych plików. Jednak nadal jest bardzo przydatne.

4

Większość z tych odpowiedzi nie zrobi rozmyta szukają jak Sublime Text to robi - mogą dopasować część odpowiedzi, ale nie robią ładne „tylko znaleźć wszystkie litery w tym porządek "zachowania".

Myślę, że jest to trochę bliżej tego, co chcesz. Przygotowałem specjalną wersję CD ("fcd"), która używa wyszukiwania rozmytego do znalezienia katalogu docelowego. Super proste - wystarczy dodać do swojej bashrc:

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

To doda * od każdej litery na wejściu, więc jeśli chcę, aby przejść do, na przykład,

/home/dave/results/sample/today 

mogę wystarczy wpisać jedną z następujących czynności:

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

Korzystanie pierwszy jako przykład, to wykonać cd /*h*/*d*/*r*/*s*p*l*/*t* i niech sortowanie Shella, co rzeczywiście pasuje.

Dopóki pierwszy znak jest poprawny, a jedna litera z każdego katalogu na ścieżce jest napisana, znajdzie to, czego szukasz. Być może dostosujesz to do swoich potrzeb? Ważny bit to:

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

, który tworzy rozmyte ciągi wyszukiwania.

+2

FYI, fzf (z drugiego komentarza) robi dokładnie to, dla historii poleceń, listy plików i innych rzeczy, które chcesz do niego podłączyć. Bonus: aktualizacja na żywo, wyróżnianie i stopniowe indeksowanie asynchroniczne (nie blokuje się, gdy jesteś rozmyta, dopasowując się do katalogu z plikami 30k). – chenglou

+0

Zgoda! Od napisania tej odpowiedzi natknąłem się na FZF gdzieś po drodze, a teraz to właśnie używam. Świetne narzędzie. – dlonie

1
find . -iname '*foo*' 

Nieczułe na znalezione nazwy plików zawierające foo.

+0

Nie sądzę, że jest to poprawne użycie 'find'. – evanrmurphy

+1

Prawidłowe użycie jak w ...? – user1338062

+0

Gdy uruchomię to, nie powiedzie się z 'find: nielegalna opcja - i'. Jestem teraz na Macu. Może 'find' działa inaczej między Mac i Linux. – evanrmurphy

0

fd to prosta, szybka i przyjazna użytkownikowi alternatywa dla znalezienia.

Demo ze strony projektu GitHub:

Powiązane problemy