Bulk Rename Files

linux command-line

The default rename function on Arch is quite useful, but only has quite basic substitute options.

The format of the command is rename <search-text> <replace-text> file-glob

For this example, create a few example files with touch test1.md test2.md test3.md.

rename .md .html *.md
rename test test00 *.html

The first command above changes the extension from ".md" to ".html", and the second one adds a "00" after "test". The files will end up as test001.html, test002.html and test003.html.

There are a few useful options that rename has; a good way to preview what might happen without actually changing any file names is to use the options -n (no action) and -v for verbose.

Here is an example:

rename -nv 00 '' *.html
`test001.html' -> `test1.html'
`test002.html' -> `test2.html'
`test003.html' -> `test3.html'

Another useful option is -i which is for interactive mode. This will prompt you to confirm each change in turn.

A more powerful alternative

There is a much more powerful alternative for rename is perl-rename (in some distributions this may be the default and actually called rename, but not for Arch)

sudo pacman -S perl-rename
touch test.md test2.md test3.md

This has perl regular expression type subsitution commands, and this first example capitalises all letters:

>> perl-rename -vn 'y/a-z/A-Z/' *.html
test001.html -> TEST001.HTML
test002.html -> TEST002.HTML
test003.html -> TEST003.HTML

A slightly more unconventional example here replaces all instances of t with s and s with a:

perl-rename -vn 'y/te/sa/' *.html
test001.html -> sass001.hsml
test002.html -> sass002.hsml
test003.html -> sass003.hsml

And finally a simple substituion example to update the extension again:

perl-rename -vn 's/.html$/.txt/' *.html
test001.html -> test001.txt
test002.html -> test002.txt
test003.html -> test003.txt
Published on 03 May 2021