Supposons que j'ai un fichier nommé filename123.txt
et que c'est le fichier unique qui est nommé ainsi, et je peux le locate
faire avec la commande locate filename123
. Et il ne renvoie que ce fichier.
Maintenant, je veux l'ouvrir avec vi
/ vim
. Mais je ne veux pas aller à cet emplacement et taper la vi
commande suivie du nom de fichier. Ici, je veux que le résultat de locate filename123
soit ajouté à la commande vi. Comment faire? J'ai déjà essayé:
locate filename123 | vi
Mais cela ne fonctionne pas. Et cette erreur vient dans le terminal:
santosh@santosh:~$ locate filename123 | vi
Vim: Warning: Input is not from a terminal
Vim: Error reading input, exiting...
Vim: Finished.
command-line
terminal
vim
io-redirection
locate
Santosh Kumar
la source
la source
Réponses:
Vous pouvez utiliser
xargs
:Par défaut,
xargs
il exécutera le moins possible d'instances de la commande spécifiée, en transmettant autant de paramètres que possible en fonction de l' ARG_MAX du système . Pour limiter le nombre de paramètres transmis à une instance devi
, utilisezxargs
l'-n
option ' .Pour gérer les noms de fichiers contenant des espaces, utilisez
xargs
l'-d
option ' :Pour gérer les noms de fichiers contenant des sauts de ligne, utilisez
xargs
l'-0
optionlocate
' avec l'-0
option':(Si
-0
n'est disponible sur aucun d'entre eux, vérifiez--null
aussi, ou une autre façon de spécifier le caractère\000
comme délimiteur.)la source
locate
commande en entrée à vi. Vi, comme tout autre programme, s'attend à ce que le nom du ou des fichiers fonctionne comme arguments.Vous pouvez utiliser l'extension de commande:
Pour faire
vim
lire son stdin, vous pouvez le fairevim -
, mais cela vous donnera juste la sortielocate
dont les chemins sont des noms de fichiers. Cela pourrait cependant fonctionner, l'utilisation devim
gf
la commande normale ouvrira alors le chemin sur lequel se trouve le curseur.Éditer
Dans le cas de noms de fichiers contenant des espaces, il vaut mieux utiliser l'
xargs
option mentionnée ou lavim
solution décrite ci-dessus. Remarque pourgf
travailler, vous devez ajouter de l'espace àisfname
:Cette astuce et ses alternatives sont décrites ici .
Modifier 2
Ajout de citations et
head
comme suggéré par PeterO dans les commentaires .la source
another
etfile
:(.vi "$(locate filename123)"
... Pour vous assurer qu'il n'a qu'un seul nom de fichier à traiter:vi "$(locate filename123 |head -n1)"
Le moyen le plus simple est de passer
locate
en substitution de shell , comme:Vous pouvez également envisager d'utiliser
find
au lieu delocate
passer des noms de fichiers à modifier, par exemple:Sur Unix / OSX, vous pouvez utiliser
xargs
un-o
paramètre, comme:Ou sous Linux, essayez la solution de contournement suivante en utilisant:
Si vous utilisez différentes commandes, utilisez la substitution de commandes pour y parvenir, comme:
Vous pouvez également utiliser GNU
parallel
au lieu dexargs
pour forcer l'allocation tty, par exemple:Remarque:
parallel
sous Unix / OSX ne fonctionnera pas car il a des paramètres différents et ne prend pas en charge tty.De nombreuses autres commandes populaires fournissent également une allocation pseudo-tty (comme
-t
dansssh
), alors vérifiez l'aide.Une autre suggestion serait d'utiliser
vipe
(un canal de commande Vim) ou d'utiliser le script simple suivant:En relation:
la source