Supongamos que tengo un archivo llamado filename123.txt
y es el único archivo que se llama así, y puedo locate
hacerlo 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 vi
comando seguido del nombre del archivo. Aquí quiero que el resultado de locate filename123
se 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
, usexargs
la-n
opción ' .Para manejar nombres de archivos que contienen espacios, use
xargs
la-d
opción ' :Para manejar nombres de archivo que contienen líneas nuevas, use
xargs
la-0
opción ' junto conlocate
la-0
opción ' s :(Si
-0
no está disponible en ninguno de ellos, verifíquelo--null
también u otra forma de especificar el carácter\000
como delimitador).fuente
locate
comando 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
vim
leer su stdin, puede hacerlovim -
, pero eso solo le dará el resultado delocate
que son rutas de nombre de archivo. Sin embargo, esto podría funcionar, el usovim
gf
del 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
xargs
opción mencionada o lavim
solución descrita anteriormente. Nota para hacer elgf
trabajo necesita agregar espacio aisfname
:Este consejo y alternativas se describen aquí .
Editar 2
Citas agregadas y
head
según lo sugerido por PeterO en los comentarios .fuente
another
yfile
:(.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
locate
como sustitución de shell , como:También puede considerar usar en
find
lugar delocate
pasar nombres de archivo para editar, por ejemplo:En Unix / OSX puede utilizar
xargs
con-o
los 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
parallel
lugar dexargs
forzar la asignación de tty, por ejemplo:Nota:
parallel
en 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
-t
enssh
), así que busca ayuda.Otra sugerencia sería usar
vipe
(una tubería de comando Vim) o usar el siguiente script simple:Relacionado:
fuente