Supongamos que tengo un archivo llamado filename123.txty es el único archivo que se llama así, y puedo locatehacerlo con el comando locate filename123. Y solo devuelve este archivo.
Ahora quiero abrirlo con vi/ vim. Pero no quiero ir a esa ubicación y escribir el vicomando seguido del nombre del archivo. Aquí quiero que el resultado de locate filename123se agregue al comando vi. ¿Como lo puedo hacer? Ya probé:
locate filename123 | vi
Pero esto no funciona. Y este error viene en la 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
fuente
fuente

Respuestas:
Puedes usar
xargs:De forma predeterminada
xargs, ejecutará la menor cantidad posible de instancias del comando especificado, pasando tantos parámetros como sea posible de acuerdo con el ARG_MAX del sistema . Para limitar el número de parámetros pasados a una instancia devi, usexargsla-nopción ' .Para manejar nombres de archivos que contienen espacios, use
xargsla-dopción ' :Para manejar nombres de archivo que contienen líneas nuevas, use
xargsla-0opción ' junto conlocatela-0opción ' s :(Si
-0no está disponible en ninguno de ellos, verifíquelo--nulltambién u otra forma de especificar el carácter\000como delimitador).fuente
locatecomando como entrada a vi. Vi, como cualquier otro programa, espera que el nombre del archivo (s) funcione como argumentos.Puede usar la expansión de comando:
Para hacer
vimleer su stdin, puede hacerlovim -, pero eso solo le dará el resultado delocateque son rutas de nombre de archivo. Sin embargo, esto podría funcionar, el usovimgfdel comando normal abrirá la ruta en la que está el cursor.Editar
En el caso de los nombres de archivo con espacios en ellos, es mejor usar la
xargsopción mencionada o lavimsolución descrita anteriormente. Nota para hacer elgftrabajo necesita agregar espacio aisfname:Este consejo y alternativas se describen aquí .
Editar 2
Citas agregadas y
headsegún lo sugerido por PeterO en los comentarios .fuente
anotheryfile:(.vi "$(locate filename123)"... Para asegurarse de que solo tenga un nombre de archivo para tratar:vi "$(locate filename123 |head -n1)"La forma más simple es pasar
locatecomo sustitución de shell , como:También puede considerar usar en
findlugar delocatepasar nombres de archivo para editar, por ejemplo:En Unix / OSX puede utilizar
xargscon-olos parámetros, tales como:O en Linux intente la siguiente solución usando:
Si está usando comandos diferentes, use la sustitución de comandos para lograr eso, como:
Alternativamente, use GNU en
parallellugar dexargsforzar la asignación de tty, por ejemplo:Nota:
parallelen Unix / OSX no funcionará ya que tiene diferentes parámetros y no es compatible con tty.Muchos otros comandos populares también proporcionan asignación de pseudo-tty (como
-tenssh), así que busca ayuda.Otra sugerencia sería usar
vipe(una tubería de comando Vim) o usar el siguiente script simple:Relacionado:
fuente