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
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 {} + ; }
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. ;-)
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:
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
Recharger la configuration ou se déconnecter et se reconnecter
source ~./bashrc
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.