¿Cómo `localizar` múltiples archivos y abrirlos en vim?

10

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.
Santosh Kumar
fuente

Respuestas:

12

Puedes usar xargs:

locate filename123 | xargs vi

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 de vi, use xargsla -nopción ' .

Para manejar nombres de archivos que contienen espacios, use xargsla -dopción ' :

locate filename123 | xargs -d '\n' vi

Para manejar nombres de archivo que contienen líneas nuevas, use xargsla -0opción ' junto con locatela -0opción ' s :

locate -0 filename123 | xargs -0 vi

(Si -0no está disponible en ninguno de ellos, verifíquelo --nulltambién u otra forma de especificar el carácter \000como delimitador).

hombre trabajando
fuente
¿Me puede decir qué es lo que me impedía antes de abrir este archivo?
Santosh Kumar
1
@Santosh Estaba pasando la salida del locatecomando como entrada a vi. Vi, como cualquier otro programa, espera que el nombre del archivo (s) funcione como argumentos.
Gilles 'SO- deja de ser malvado'
@manatwork El problema es que no puedo ubicar y abrir el nombre del archivo con espacios. Por ejemplo, este comando abrirá varios archivos en vim: busque I \ have \ to \ download | xargs vi
Santosh Kumar
3

Puede usar la expansión de comando:

vi "$(locate filename123 | head -n1)"

Para hacer vimleer su stdin, puede hacerlo vim -, pero eso solo le dará el resultado de locateque son rutas de nombre de archivo. Sin embargo, esto podría funcionar, el uso vim gfdel 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 la vimsolución descrita anteriormente. Nota para hacer el gftrabajo necesita agregar espacio a isfname:

set isfname+=32

Este consejo y alternativas se describen aquí .

Editar 2

Citas agregadas y headsegún lo sugerido por PeterO en los comentarios .

Thor
fuente
Para archivos con espacios en blanco, cuando inserto \ en el nombre del archivo, como vi $ (ubique otro \ archivo). El vim lo abre como dos archivos separados anothery file:(.
Santosh Kumar
Su respuesta solo funciona cuando no tengo espacios en el archivo que estoy localizando.
Santosh Kumar
Respuesta actualizada
Thor
2
@Thor: para un solo archivo, como se menciona en la pregunta, solo necesita ajustar las comillas alrededor del proceso de sustitución: vi "$(locate filename123)"... Para asegurarse de que solo tenga un nombre de archivo para tratar:vi "$(locate filename123 |head -n1)"
Peter.O
PeterO: Tienes razón, solo lo probé con múltiples golpes. He añadido tus comentarios a la respuesta.
Thor
1

La forma más simple es pasar locatecomo sustitución de shell , como:

vim $(locate filename123)

También puede considerar usar en findlugar de locatepasar nombres de archivo para editar, por ejemplo:

find . -name 'filename123' -exec vim {} +

En Unix / OSX puede utilizar xargscon -olos parámetros, tales como:

locate filename123 | xargs -o vim

-oVuelva a abrir stdin como / dev / tty en el proceso secundario antes de ejecutar el comando. Esto es útil si desea que xargs ejecute una aplicación interactiva.

O en Linux intente la siguiente solución usando:

locate filename123 | xargs -J% sh -c 'vim < /dev/tty $@'

Si está usando comandos diferentes, use la sustitución de comandos para lograr eso, como:

vim $(locate filename123)
vim `locate filename123`

Alternativamente, use GNU en parallellugar de xargsforzar la asignación de tty, por ejemplo:

locate filename123 | parallel -X --tty vi

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 -ten ssh), así que busca ayuda.

Otra sugerencia sería usar vipe(una tubería de comando Vim) o usar el siguiente script simple:

#!/bin/sh
# usage: locate filename123 | vip
exec vim < /dev/tty "$@"

Relacionado:

kenorb
fuente