web-dev-qa-db-fra.com

Alias ​​pour rechercher des fichiers par nom et les ouvrir dans vim

J'ai déjà un alias pour rechercher (plus) rapidement des fichiers:

alias f='find . -iname'

Je l'utilise comme tel:

$ f *statis*
./main/statistics.py
./test/test_statistics.py

Maintenant, je voudrais avoir un autre alias qui effectue la même recherche mais, au lieu d'imprimer les fichiers trouvés, les ouvrira dans vim. Idéalement, cela fonctionnerait lorsque plusieurs fichiers sont trouvés.

J'ai essayé (en utilisant 'echo' au lieu de 'vim' à des fins de débogage):

 alias fvi='find . -exec echo {} + -iname'

... mais il semble que -exec annule le -iname à venir:

$ fvi *statis*
 ./main/statistics.py ./main/probability.py ./test/test_statistics.py 
 ./test/test_probability.py
1
Manur

Depuis le -exec {} les arguments doivent venir après le -iname (puisque find 'exécute' ses arguments de gauche à droite), vous ne pouvez pas faire ce que vous voulez en utilisant un alias. Au lieu de cela, laissez votre alias invoquer un script contenant par exemple:

#!/bin/sh
find . -iname "$1" -exec vi {} \;

Notez que cela invoquera vi une fois pour chaque fichier trouvé. S'il existe de nombreux fichiers de ce type, vous en ferez plusieurs :q! ou ZZ pour en sortir. Si vous souhaitez appeler une instance de vi pour modifier tous les fichiers trouvés, modifiez le \; à un +:

find . -iname "$1" -exec vi {} +

Vous pouvez également utiliser la substitution de commandes pour fournir les arguments à vi:

vi $(find . -iname "$1")   # do not use when file names may contain whitespace

Cependant, l'inconvénient est qu'il échouera sur les noms de fichiers contenant des espaces.

Si vous préférez ne pas créer de fichier de script pour la commande, placez plutôt l'instruction dans une fonction Shell:

fvi () { find . -iname "$1" -exec vi {} + ; }
6
zwets

... ou utilisez un hack sale pour utiliser l'alias comme si il fallait des paramètres ...

Comme plusieurs réponses l'ont souligné, les alias ne prennent pas en charge les paramètres comme le font les scripts et les fonctions Shell. L'invocation d'un alias revient à étendre l'alias à sa valeur, puis à exécuter la ligne de commande résultante avec tous les arguments toujours en place.

Aucune substitution de paramètres n'a lieu. Si vous souhaitez une substitution de paramètres, définissez une fonction au lieu d'un alias. C'est autant de frappes:

fvi () { find . -iname "$1" -exec vi {} + ; }

Cependant, si vous insistez, voici un hack pour faire référence aux arguments de ligne de commande dans une extension d'alias: récupérez-les dans l'historique du Shell. Dans votre cas, cela fera l'affaire:

alias fvi='find . -iname "$(history|tail -n1|sed -e "s/^.*\sfvi\s*//")" -exec vi {} + #'

La sortie du sous-shell exécutant history | tail -n1 | sed -e "s/.*\sfvi\s*//" est ce qui suit fvi. Cela est épissé dans le find . -iname HERE -exec vi {} +, c'est ce dont vous avez besoin.

Sauf que ... il y a ce signe de hachage étrange à la fin de la définition de l'alias. Je laisse au lecteur le soin de comprendre sa raison d'être, pour le sourire que dévoile un hack complet. ;-)

3
zwets

Si vous avez vraiment besoin d'un alias, vous pouvez utiliser cette réponse.


Un alias dans bash n'accepte pas les paramètres. Vous avez donc besoin d'une fonction et d'un alias et d'une commande find légèrement modifiée:

  1. Modifiez votre .bashrc

    nano ~/.bashrc
    

    et ajoutez les lignes ci-dessous à la fin du fichier

    myfvi() {
        find . -type f -iname "$1" -exec vi -o {} +
    }
    alias fvi=myfvi
    
  2. Recharger la configuration ou se déconnecter et se reconnecter

    source ~./bashrc
    
  3. Commencer avec

    fvi '*statis*'
    

    Mais vous pouvez également utiliser la fonction directement

    myfvi '*statis*'
    

Exemple

J'ai trois fichiers dans mon dossier

$ ls -laog
total 4288
drwxrwxr-x  2 4329472 Sep  7 11:43 .
drwx------ 67   20480 Sep  7 11:28 ..
-rw-rw-r--  1       0 Sep  7 11:43 bar
-rw-rw-r--  1       4 Sep  7 11:23 foo
-rw-rw-r--  1       4 Sep  7 11:23 foobar

Et quand j'utilise l'alias

fvi 'foo*'

vi s'ouvre avec deux fichiers.

enter image description here

1
A.B.