Multiple Move

Way back before Linux was even brought to life, sucky ol MS-DOS had an easy way to rename many files according to a simple scheme, which still works in today's DOS shells (a big hint for stuck Windows Explorer users):

C:\>ren *.txt *.htm

Semi-Desktop Environments like Norton Commander also had their way with it, mark a bunch of files, F6/Move to "*.htm" and that's it. Yet, Unix and Linux users often look for such a tool, and mostly end up writing their own, or do it by hand after all, because case-sensitive filesystem need it more than ever.

According to the mmv(1) manpage, Vladimir Lanin already wrote mmv back in 1989 -- yet this nice utility appeared first in the "late" Linux distros, IIRC it was SUSE Linux 7.x that had it -- and that has been 1999 -- long after 1989.

The syntax is a bit different than the DOS one, but it's a little more flexible in that it allows multiple placeholders and even conversions. The above text to html would look like this:

mmv "*.txt" "#1.htm"

Conversions are necessary when e.g. files from a case-insensitive filesystem (such as FAT, NTFS, ISO-9660) are copied. As of Linux 2.4.??, the vfat and iso9660 fs code seems to displays filenames whose chars are all uppercase in lowercase. (Which is BTW meaningful.) Yet, in cases where manual adjust is needed, mmv helps out:

mmv "*" "#l1"

Where the small L stands for lowercase. Note that this will NOT work on case-insensitive filesystems, since a rename from e.g. "ABcd" "abcd" is considered the same filename. You will need to use an intermediate temporary filename. The recursive_lower script from HXtools will do this. It operates on single files and/or directories, and if it is a dir, descends into it.

recusive_lower /C/WINDOWS

Will this lower everything in /C/WINDOWS plus WINDOWS itself, but will not change C.

A small "U" can be used to uppercase certain characters. An asterisk (*) stands for zero or more characters, a question mark (?) for exactly one character. Thus, you could use this to upper-ize the first character:

mmv "?*" "#u1#2"

That's the basics of mmv, hope it helped you. mmv can do some more (excluding the vfat workaround), which is described in its manpage.