Floue de recherche de fichier dans la console linux
-
12-11-2019 - |
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?
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.
Projet GitHub: WHITEBOB / CMINUS
Introduction sur YouTube: https://youtu.be/b8bem53cz9a
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