19

I get to use the locate command extremely often.

So if I run the following command.

locate updatedb | head -1

Then it gives me the O/p

/usr/updatedb.conf

I wonder if there is any such command that can let me open that file directly?

I am hoping for something like this.

locate updatedb | head -1 | vim
romainl
  • 23,415
Krishna
  • 420

5 Answers5

28

You're nearly done:

$ locate updatedb | head -1 | xargs vim

sometimes (under certain terminals) you need reset the terminal after editing.

$ reset
24

As an interactive editor, Vim needs both stdin and stdout, so using it within a pipe is problematic and makes Vim warn about this. For just a single file, process substitution solves this easily:

vim "$(locate updatedb | head -1)"

You can also use backticks, and that even works inside Vim itself:

:edit `locate updatedb | head -1`
Ingo Karkat
  • 23,523
6

In addition to the above answer, to avoid the "terminal corruption" stated by Jacobo de Vera in the comment, use the xargs option -o or --open-tty to make vim assume the input is from a terminal, not stdin.

$ locate updatedb | head -1 | xargs -o vim

See: https://unix.stackexchange.com/a/44428/307359

0

I know this is bad solution but I used this for creating alias in .bashrc:

locate updatedb  > /tmp/vimForTempDontTouch && vim /tmp/vimForTempDontTouch

Downsides: ugly

Advantage: No side effects with terminal

Tebe
  • 103
0

This is what old good standard vipe is used for.

FYI, I wrote pyvipe(python port of it) for my research. The linked github code is truly short like the original vipe.

Turns out it is related to file descriptors and dup() and dup2().