Rozmyte wyszukiwanie plików w konsoli Linuksa


Czy ktoś zna sposób na szybkie wyszukiwanie rozmyte z konsoli linuxa?
Dość często spotykam się z sytuacją, w której muszę znaleźć plik w projekcie, ale nie pamiętam dokładnej nazwy pliku. W

Wysublimowany edytor tekstu
http://www.sublimetext.com/2
Nacisnąłbym Ctrl-P i wpisałbym część nazwy, która da ci listę plików do wyboru. To niesamowita funkcja, z której jestem całkiem zadowolony. Problem w tym, że przez większość czasu muszę przeglądać kod w konsoli na zdalnych maszynach poprzez ssh. Zastanawiam się więc, czy istnieje narzędzie podobne do funkcji „Go Anywhere” dla konsoli Linuksa?
Zaproszony:
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

możesz znaleźć

FZF
https://github.com/junegunn/fzf
przydatny. Jest to wszechstronny rozmyty przeszukiwacz napisany w Go, którego można używać z dowolną listą rzeczy: plikami, procesami, historią poleceń, gałęziami git itp.
Jego skrypt instalacyjny skonfiguruje przypisanie klawisza
CTRL-T
dla Twojej powłoki. Poniższy plik GIF pokazuje, jak to działa.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Większość z tych odpowiedzi nie daje rozmytych wyszukiwań, jak ma to miejsce w przypadku wysublimowanego tekstu - mogą one pasować do części odpowiedzi, ale nie przynoszą dobrego zachowania „po prostu znajdź wszystkie litery w tej kolejności”.
Myślę, że jest to trochę bliższe temu, czego chcesz. Przygotowałem specjalną wersję cd („fcd”), która używa wyszukiwania rozmytego, aby znaleźć katalog docelowy. Super łatwe - po prostu dodaj to do swojego bashrc:
function joinstr { local IFS="$1"; shift; echo "$*"; }
function fcd { cd $(joinstr \* $(echo "$*" | fold -w1))* }

Spowoduje to dodanie * między każdą literą w wejściu, więc jeśli chcę przejść, na przykład,
/home/dave/results/sample/today

Mogę po prostu wpisać dowolne z poniższych:
fcd/h/d/r/spl/t
fcd/h/d/r/s/t
fcd/h/d/r/sam/t
fcd/h/d/r/s/ty

Używając pierwszego jako przykładu, spowoduje to wykonanie
cd/* h */* d */* r */* s * p * l */* t *
i pozwoli powłoce dowiedzieć się, co faktycznie pasuje ...
Jeśli pierwszy znak jest poprawny i zapisana jest jedna litera z każdego katalogu w ścieżce, program znajdzie to, czego szukasz. Może możesz to dostosować do swoich potrzeb? Ważnym punktem jest:
$(joinstr \* $(echo "$*" | fold -w1))*

co tworzy rozmyty ciąg wyszukiwania.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Scenariusz

fasd
https://github.com/clvv/fasd
Powłoka też jest warta uwagi.

fasd
zapewnia 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łać się do nich w wierszu poleceń.

Różni się nieco od pełnego wyszukiwania wszystkich plików, ponieważ wyszukuje tylko

niedawno otwarty

akta. Jest to jednak nadal bardzo przydatne.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Zwykle używam:
ls -R | grep -i [whatever I can remember of the file name]

Z katalogu powyżej, w którym spodziewam się, że plik będzie się znajdował - im wyżej wejdziesz w drzewo katalogów, tym wolniej będzie.
Kiedy znajdę dokładną nazwę pliku, używam jej w funkcji find:
find . [discovered file name]

Można to zwinąć do jednej linii:
for f in $(ls --color=never -R | grep --color=never -i partialName); do find -name $f; done

(Znalazłem problem polegający na tym, że LS i grep mają alias „--color = auto”)
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

find . -iname '*foo*'

Wyszukiwanie bez rozróżniania wielkości liter w nazwach plików zawierających
foo
.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

fd
https://github.com/sharkdp/fd
to prosta, szybka i wygodna alternatywa dla wyszukiwania.

Demo ze strony GitHub projektu:
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Możesz spróbować

AGREP
http://www.tgries.de/agrep/
lub coś innego, co używa biblioteki regex

TRE
http://laurikari.net/tre/
.

(Z ich witryny

:)
TRE is a lightweight, robust, and efficient POSIX compliant regexp matching library with some exciting features such as approximate (fuzzy) matching.
At the core of TRE is a new algorithm for regular expression matching with submatch addressing. The algorithm uses linear worst-case time in the length of the text being searched, and quadratic worst-case time in the length of the used regular expression. In other words, the time complexity of the algorithm is O(M2N), where M is the length of the regular expression and N is the length of the text. The used space is also quadratic on the length of the regex, but does not depend on the searched string. This quadratic behaviour occurs only on pathological cases which are probably very rare in practice.TRE is not just yet another regexp matcher. TRE has some features which are not there in most free POSIX compatible implementations. Most of these features are not present in non-free implementations either, for that matter.Approximate pattern matching allows matches to be approximate, that is, allows the matches to be close to the searched pattern under some measure of closeness. TRE uses the edit-distance measure (also known as the Levenshtein distance) where characters can be inserted, deleted, or substituted in the searched text in order to get an exact match. Each insertion, deletion, or substitution adds the distance, or cost, of the match. TRE can report the matches which have a cost lower than some given threshold value. TRE can also be used to search for matches with the lowest cost.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Nie wiem, jak dobrze znasz terminal, ale może ci to pomóc:
find | grep 'report'
find | grep 'report.*2008'

Przepraszamy, jeśli znasz już
grep
i szukałeś czegoś bardziej zaawansowanego.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Możesz wykonać następujące czynności
grep -iR "text to search for" .

gdzie „.” jest punktem początkowym, więc możesz zrobić coś takiego
grep -iR "text to search"/home/

Spowoduje to, że grep będzie szukał podanego tekstu w każdym pliku w katalogu/home/i wyświetli listę plików, które zawierają ten tekst.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Możesz spróbować c- (

Cminus
https://github.com/whitebob/cminus), rozmyte narzędzie do zmiany katalogu w skrypcie bash, które używa uzupełniania bash. W pewnym sensie ogranicza się to tylko do przypadkowych ścieżek odwiedzanych, ale jest naprawdę wygodny i dość szybki.
https://i.stack.imgur.com/yEZ8e.gif
Projekt GitHub:

whitebob/cminus
https://github.com/whitebob/cminus
Wprowadzenie do YouTube:

https://youtu.be/b8Bem53Cz9A
https://youtu.be/b8Bem53Cz9A
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Możesz użyć find w ten sposób dla złożonego wyrażenia regularnego:
find . -type f -regextype posix-extended -iregex ".*YOUR_PARTIAL_NAME.*" -print
Lub to dla prostszych dopasowań podobnych do globów:
find . -type f -name "*YOUR_PARTIAL_NAME*" -print
Możesz też użyć find2perl (który jest znacznie szybszy i bardziej zoptymalizowany niż find), na przykład:
find2perl . -type f -name "*YOUR_PARTIAL_NAME*" -print | perl
Jeśli chcesz tylko zobaczyć, jak robi to Perl, usuń
| perl
, a zobaczysz kod, który generuje. Nawiasem mówiąc, to bardzo dobry sposób na naukę.
Napisz też taką szybką otokę basha i wywołuj ją w dowolnym momencie:
#!/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

Nazwij go na przykład
qsearch
, a następnie nazwij go
qsearch. coś

Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się