Originally created 11/1999; Moved to Lab 12/2001; Updated 07/06/2004

Batch File Rename By File Extension in Unix

These are one-liners which batch rename files meeting a certain criteria under unix

These are very powerful command line tools. They have been used on FreeBSD, Linux, and MacOSX with success. But as with any batch file changing, you are advised to use them with caution. Backups are your friend!

# change .htm files to .html
for file in *.htm ; do mv $file `echo $file | sed 's/\(.*\.\)htm/\1html/'` ; done

# change .html files to .htm
for file in *.html ; do mv $file `echo $file | sed 's/\(.*\.\)html/\1htm/'` ; done

#change .html files to .shtml
for file in *.html ; do mv $file `echo $file | sed 's/\(.*\.\)html/\1shtml/'` ; done

#change .html files to php
for file in *.html ; do mv $file `echo $file | sed 's/\(.*\.\)html/\1php/'` ; done

More Notes

Visitor Chris Hancock / itoph.com writes in with a question, and answers it himself

(Your page) definitely helped me... but I'm still stuck.

I have Mac OS X, and I need to rename a directory with files like:

[itoph:Coda] toph% ls -l
total 59576
-rw-r--r--  1 toph  staff  4140123 Apr 18 09:43 Bonzo's Montruex
-rw-r--r--  1 toph  staff  4914598 Apr 18 09:43 Darlene
-rw-r--r--  1 toph  staff  4131343 Apr 18 09:43 I Can't Quit You Babe
-rw-r--r--  1 toph  staff  2260992 Apr 18 09:43 Ozone Baby
-rw-r--r--  1 toph  staff  2917166 Apr 18 09:43 Poor Tom
-rw-r--r--  1 toph  staff  4331548 Apr 18 09:43 Walter's Walk
-rw-r--r--  1 toph  staff  2521786 Apr 18 09:43 We're Gonna Grove
-rw-r--r--  1 toph  staff  5264433 Apr 18 09:43 Wearing and Tearing

Based on your page I've got this:
[itoph:Coda] toph% more test.sh
for i in * ; do
echo mv \'$i\' \'$i.mp3\'

That doesn't work because of the 's in the file names.  If I leave out
the \'s in the shell script the spaces in the file names cause a problem.

He then follows up with:

I figured it out.  This is the shell script that works:

[itoph:Coda] toph% more t.sh
for i in * ; do
echo mv \"$i\" \"$i.mp3\" | sh

It looks a bit weird.  Why wouldn't I just do this:

[itoph:Coda] toph% more t.sh
for i in * ; do
mv \"$i\" \"$i.mp3\"

Well, the reason is because it doesn't work.  I get this error:

usage: mv [-fi] source target
       mv [-fi] source ... directory

I don't understand how echoing and piping it to the shell is any
different, but, it works.

Any ideas?

To which I reply: Chris, I have no idea. The command line still manages to mystify me utterly. Congrats on finding the solution to your problem so well! Perhaps your insight will help others!

Reader Michael Dinsmore adds:

I found your page "http://artlung.com/lab/other/unix-batch-file-rename/" when I searched on "batch rename"; found it useful.

Just as I was getting the hang of it, and looking to make it a tidy AppleScript, I discovered that Apple already provided many of those same tools. At least after the developer tools have been installed; I'm not sure if that's required.

Take a look at /Applications/AppleScript/Example Scripts/Finder Scripts. I found a script that will add extensions and prefixes, as well as one that will do wildcard renaming. Very useful!

My reply: Thanks Mike!

Reader Tony A. Lambley has a solution to fixing the "spaces in names" problem. He writes:

Regarding the problem mentioned on: http://lab.artlung.com/other/unix-batch-file-rename/ using BASH you can append .mp3 and get rid of those ghastly embedded spaces with:
for e in *; do mv "$e" "`echo $e | sed -e 's/\ /_/g'`.mp3"; done

$ l
Bonzo's Montruex
We're Gonna Grove

$ l

And I reply: Thanks so much Tony. Very impressive solution!

Reader Kurt sends this reply about the tool "basename":

the classic basename(1) tool works very nicely without all of the sed ugliness:
# rename every *.htm file *.html
for f in *htm ; do mv $f `basename $f htm`html; done"
Hope you find this helpful.

Thanks Kurt! Here's a link for basename from gnu.org.

blog comments powered by Disqus
Web lab.artlung.com