Question

Quelqu'un connais un moyen pour effectuer une rapide recherche floue à partir de la console linux?

Assez souvent j'ai trouvé situation quand j'ai besoin de trouver un fichier dans un projet, mais je ne me souviens pas le nom exact.Dans Sublime éditeur de texte Je voudrais appuyez sur Ctrl-P et tapez une partie du nom, qui va produire une liste des fichiers pour sélectionner à partir.C'est une caractéristique étonnante, je suis très heureux avec.Le problème est que dans la plupart des cas, je dois parcourir un code dans une console sur des ordinateurs distants via ssh.Alors je me demandais est-il un outil similaire à "passe-Partout" pour la console Linux?

Était-ce utile?

La solution

Vous pouvez trouver FZF utile.Il s'agit d'un objectif fuzzy général écrit en déplacement qui peut être utilisé avec n'importe quelle liste de choses: fichiers, processus, historique de commande, branches git, etc.

Son script d'installation Configurez CTRL-T Keybinding pour votre coquille.Le GIF suivant montre comment ça fonctionne.

Autres conseils

L' l'etcaf script shell est probablement la peine de prendre un coup d'oeil à trop.

fasd offre un accès rapide aux fichiers et répertoires pour POSIX coquilles.Il est inspiré par des outils tels que autojump, z et v.L'etcaf conserve la trace des fichiers et répertoires que vous avez visitées, de sorte que vous pouvez rapidement de référence dans la ligne de commande.

Il diffère un peu de tout un trouver de tous les dossiers, car il ne recherche que récemment ouvert les fichiers.Cependant, il est toujours très utile.

La plupart de ces réponses ne feront pas la recherche fuzzy comme un texte sublime le fait - ils peuvent correspondre à une partie de la réponse, mais ils ne font pas que le Nice "vient de trouver toutes les lettres de ce comportement" / p>

Je pense que cela est un peu plus proche de ce que vous voulez. Je pose une version spéciale de CD ('FCD') qui utilise la recherche floue pour trouver le répertoire cible. Super simple - Ajoutez-le à votre BASHRC:

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

Cela ajoutera un * entre chaque lettre de l'entrée, donc si je veux aller à, par exemple,

/home/dave/results/sample/today

Je peux simplement taper l'une des opérations suivantes:

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

Utilisation du premier à titre d'exemple, cela exécutera cd /*h*/*d*/*r*/*s*p*l*/*t* et laissera la coquille trier ce qui correspond réellement.

Tant que le premier caractère est correct et une lettre de chaque répertoire du chemin est écrit, il trouvera ce que vous recherchez. Vous pouvez peut-être adapter cela pour vos besoins? Le bit important est:

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

qui crée la chaîne de recherche floue.

J'utilise habituellement:

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

à partir d'un répertoire ci-dessus sur lequel je m'attends à ce que le fichier soit - plus vous entrez dans l'arborescence de la répertoire, plus cela va aller plus lent.

Lorsque je trouve le nom du fichier exact, je l'utilise dans Rechercher:

find . [discovered file name]

Cela pourrait être effondré dans une ligne:

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

(J'ai trouvé un problème avec LS et GREP étant aliasé à "--Color= auto")

find . -iname '*foo*'

Insensible à la casse de trouver des noms de fichiers contenant des foo.

Je ne sais pas à quel point vous êtes familier avec le terminal, mais cela pourrait vous aider:

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

Désolé si vous connaissez déjà grep et cherchaient quelque chose de plus avancé.

Vous pouvez faire ce qui suit

grep -iR "text to search for" .

où "".Être le point de départ, vous pouvez donc faire quelque chose comme

grep -iR "text to search" /home/

Cela permettra à Grep Rechercher le texte donné à l'intérieur de chaque fichier sous / home / et de fichiers de liste contenant ce texte.

FD est une alternative simple, rapide et conviviale à trouver.

démo de la page du projet GITUB:

Vous pouvez essayer c- ( CMINUS ), un outil de changement de script de bash de Bash, quien utilisant l'achèvement de bash.Il est en quelque sorte limité par uniquement des chemins visités correspondants, mais vraiment pratique et assez rapide.

 Entrez la description de l'image ici

Projet GitHub: WHITEBOB / CMINUS

Introduction sur YouTube: https://youtu.be/b8bem53cz9a

Vous voudrez peut-être essayer Agrep ou quelque chose d'autre qui utilise le Tre Library d'expression régulière.

Vous pouvez utiliser trouver ce genre de complexe de la regex:

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

Ou cette pour de plus simple glob-comme des allumettes:

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

Ou vous pouvez aussi les utiliser find2perl (ce qui est assez rapide et le plus optimisé que le trouver), comme ceci:

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

Si vous voulez juste pour voir comment Perl t-il, retirez le | perl une partie de vous et vous verrez le code qu'il génère.C'est une très bonne façon d'apprendre par la manière.

Sinon, écrire un petit bash wrapper comme ça, et de l'appeler quand vous le souhaitez:

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

Le nom de ce quelque chose comme qsearch et puis l'appeler comme ceci: qsearch . something

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top