Quick and dirty tip I found elsewhere and keep on forgetting when I need it. When you want to bulk rename some files and want to use the comfort of vim rather than tinkering with rename.

First up, list the files of interest and throw the list into vim. For example, to get all the files in the folder.

ls -1 | nvim -

This result in your vim being opened with a buffer with on each line a file from the folder you are in, i.e., the result of ls -1.

You can then turn this into many mv commands with a simple substitution. The added " are handy in case of spaces.

:%s/.*/mv "\0" "\0"/

This turns

file1
file2
file3

into

mv "file1" "file1"
mv "file2" "file2"
mv "file3" "file3"

If the bulk change you want to make is simple enough, you can just squeeze it into that substitution. For example adding .backup to the end of every file.

If you want to make a more involved change, my personal preference is as follows. Record a macro for the first line. Next just use the macro on the other lines that need changing. So for example if you recorded a macro into the w register, then you can execute it on multiple other lines:

  • :%norm! @w for all lines,
  • :'<,'>norm! @w for visual selection.
  • :g/pattern/norm! @w for lines matching a pattern.

Finally, to execute all lines in the file use the magical looking

:w !sh

This apparently writes the lines one by one into the given command, which executes them.