web-dev-qa-db-fra.com

Recherche de fichier floue dans la console linux

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.

37
nab

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.

58
Junegunn Choi

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.

5
Chris Farmiloe

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.

4
dlonie

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")

3
mmrtnt
find . -iname '*foo*'

Recherche insensible à la casse des noms de fichiers contenant foo.

3
user1338062

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.

1
Snake007uk

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

Démo de la page du projet GitHub:

1
user1338062

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.

 enter image description here

Projet GitHub: whitebob/cminus

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

1
whitebob

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

0
Yanick Girouard

Vous voudrez peut-être essayer AGREP ou autre chose utilisant la bibliothèque TRE Expression rationnelle.

0
Tony Laidig

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é.

0
Adiel Mittmann