Est-ce que quelqu'un connaît un moyen d'effectuer une recherche fuzzy rapide depuis la console Linux?
Très souvent, je rencontre une situation lorsque je dois trouver un fichier dans un projet mais que je ne me souviens pas du nom de fichier exact. Dans Éditeur de texte Sublime , j'appuierais sur Ctrl-P et saisirais une partie du nom, ce qui produirait une liste des fichiers à sélectionner. C'est une fonctionnalité incroyable dont je suis assez content. Le problème est que dans la plupart des cas, je dois parcourir un code dans une console sur des machines distantes via ssh. Je me demande donc s'il existe un outil similaire à la fonctionnalité "Go Anywhere" pour la console Linux.
Vous pouvez trouver fzf utile. C'est un Finder fuzzy à usage général écrit en Go qui peut être utilisé avec n'importe quelle liste d'éléments: fichiers, processus, historique des commandes, branches git, etc.
Son script d’installation installera CTRL-T
corrélation pour votre shell. Le GIF suivant montre comment cela fonctionne.
Le script fasd Shell vaut probablement la peine d’être examiné également.
fasd
offre un accès rapide aux fichiers et aux répertoires des shells POSIX. Il s'inspire d'outils tels que autojump, z et v. Fasd garde une trace des fichiers et des répertoires auxquels vous avez accédé, afin que vous puissiez les référencer rapidement dans la ligne de commande.
Cela diffère un peu de la recherche complète de tous les fichiers, car il ne recherche que les fichiers récemment ouverts . Cependant, cela reste très utile.
La plupart de ces réponses ne font pas une recherche floue comme le fait le texte sublime - elles peuvent correspondre à une partie de la réponse, mais elles ne font pas le comportement de Nice 'il suffit de trouver toutes les lettres dans cet ordre'.
Je pense que c'est un peu plus près de ce que vous voulez. J'ai mis en place une version spéciale de cd ('fcd') qui utilise la recherche floue pour trouver le répertoire cible. Super simple - ajoutez ceci à votre base:
function joinstr { local IFS="$1"; shift; echo "$*"; }
function fcd { cd $(joinstr \* $(echo "$*" | fold -w1))* }
Cela va ajouter 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'un des éléments suivants:
fcd /h/d/r/spl/t
fcd /h/d/r/s/t
fcd /h/d/r/sam/t
fcd /h/d/r/s/ty
En prenant le premier comme exemple, ceci exécutera cd /*h*/*d*/*r*/*s*p*l*/*t*
et laissera le shell déterminer ce qui correspond réellement.
Tant que le premier caractère est correct et qu'une lettre de chaque répertoire du chemin est écrite, il trouvera ce que vous recherchez. Peut-être que vous pouvez adapter cela à 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]
D'un répertoire ci-dessus où je m'attends à ce que le fichier soit - plus vous montez dans l'arborescence de répertoires, plus cela va être lent.
Quand je trouve le nom de fichier exact, je l’utilise dans find:
find . [discovered file name]
Cela pourrait être réduit en une seule 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 associés à "--color = auto")
find . -iname '*foo*'
Recherche insensible à la casse des noms de fichiers contenant foo
.
Vous pouvez faire ce qui suit
grep -iR "text to search for" .
où "." être le point de départ, de sorte que vous pouvez faire quelque chose comme
grep -iR "text to search" /home/
Ceci fera rechercher par grep le texte donné dans chaque fichier sous/home/et répertorier les fichiers contenant ce texte.
fd est une alternative simple, rapide et conviviale à trouver.
Démo de la page du projet GitHub:
Vous pouvez essayer c- ( Cminus ), un outil de changement de répertoire fuzzy de script bash, qui utilise la complétion de bash. Il est en quelque sorte limité en faisant correspondre uniquement les chemins visités, mais vraiment pratique et assez rapide.
Projet GitHub: whitebob/cminus
Introduction sur YouTube: https://youtu.be/b8Bem53Cz9A
Vous pouvez utiliser find comme ceci pour les expressions rationnelles complexes:
find . -type f -regextype posix-extended -iregex ".*YOUR_PARTIAL_NAME.*" -print
Ou ceci pour des correspondances plus simples:
find . -type f -name "*YOUR_PARTIAL_NAME*" -print
Vous pouvez également utiliser find2Perl (qui est plus rapide et plus optimisé que find), comme ceci:
find2Perl . -type f -name "*YOUR_PARTIAL_NAME*" -print | Perl
Si vous voulez juste voir comment Perl le fait, supprimez la partie | Perl
et vous verrez le code qu'il génère. C'est un très bon moyen d'apprendre en passant.
Sinon, écrivez un wrapper bash rapide comme celui-ci et appelez-le quand vous voulez:
#! /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
Nommez quelque chose comme qsearch
et appelez-le ainsi: qsearch . something
Je ne sais pas si vous connaissez bien le terminal, mais cela pourrait vous aider:
find | grep 'report'
find | grep 'report.*2008'
Désolé si vous connaissez déjà grep
et cherchez quelque chose de plus avancé.