How can I edit all the files returned by find in vi in Linux?
This should do the trick:
find . -name "*.txt" -exec vim {} +
Use Vim, it's better for your health. :-)
The oft-overlooked +
option to -exec
makes all filenames (up to line length limits) appear in one line, i.e. you still get all the files opened in one vim
session (navigated with :n
for next and :N
for previous file).
With vim -p
you get a file tab for each file. Check :help tab-page-commands
for more details.
With vim -o
you will get horizontally split windows for each file, vim -O
vertically split windows. Check :help window-move-cursor
for more details.
Note that the previous version of this answer, vim $(find . -name "*.txt")
, does not work with spaces in filenames, and has security implications.
Piping into xargs vi
gives a Warning: Input is not from a terminal
, plus a terminal with completely bogus behaviour afterwards. User grawity explained why in a comment below, and with a bit more explanation in this question.
Or run vim and from there:
:args **/*.txt
Additionally, if you wanted them opened one at a time, you can also use find -exec or use a simple for loop. Edited per ceving's comment.
find . -name "*.txt" -exec vi {} \;
or
OLDIFS=$IFS
IFS=$(echo -en "\n\b")
for i in `find . -name "*.txt"`
do
vi $i
done
IFS=$OLDIFS
To edit all *.txt
, you can just run: vim *.txt
. To edit files returned by find
, read futher.
On Unix/macOS, you can use find
with BSD xargs
(see: man xargs
), e.g.
find -L . -name "*.txt" -type f -print0 | xargs -o -0 vim
-o
(xargs
): Reopen stdin as /dev/tty in the child process before executing the command.
Related: Terminal borked after invoking Vim with xargs at Vim.SE.