I have a list with ideas of “useful tools that I want to write someday” that would likely take hundreds of years to complete. Finding out that somebody has already written one the tools in this list pleases me immensely, not only because I can use the tool in this lifetime, but actually right now!
Today I came across vidir, from the moreutils package. It lets me edit a
filenames and directories in Vim.
The idea is pretty simple; when I want to edit the filenames inside a directory,
I run vidir path/to/directory/. This opens my text editor1 with a
temporary file where each line contains a number and a filename. I can edit
filenames, exit Vim, and vidir will rename these files to match my changes.
Deleting lines deletes the corresponding files.
Here’s an example (when using vidir photos/Unsorted/:
0001	photos/20120718_002.jpg
0002	photos/IMG_0021.JPEG
0003	photos/IMG_0166.JPEG
0004	photos/IMG_0191.JPEG
0005	photos/IMG_1168.JPEG
0006	photos/IMG_1170.JPEG
0007	photos/IMG_1465.JPEG
0008	photos/IMG_1796.JPEG
0009	photos/IMG_1802.JPEG
0010	photos/IMG_1902.JPEG
0011	photos/IMG_2032.JPG
[...]
I can quickly replace all instances of \.JPEG$ and \.jpg$ with .jpeg using
Vim’s replacement command2. Once I exit Vim, vidir will rename all
these files at once. If I give multiple files the same name, one of them will
include a trailing ~, the next one a trailing ~1, and so forth. This
prevents unintentionally overwriting files.
The numbers at the beginning of each line are used internally by vidir to
match which line corresponds to which original file.
My own idea was pretty similar, but for some reason I had planned on using inode numbers instead of sequential numbers. I now see that it the design could be much simpler.
vidir can also handle files in multiple directories or an entire tree of
files. For example:
fd -t d  | xargs vidir  # all files in current directory tree
fd 'py$' | xargs vidir  # all python files in the current directory tree