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
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\' done 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 done 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\" done 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 before: $ l Bonzo's Montruex We're Gonna Grove after: $ l Bonzo's_Montruex.mp3 We're_Gonna_Grove.mp3
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.