How do I rename all files to lowercase?

MacosFileBash

Macos Problem Overview


I have for example TREE.wav, ONE.WAV. I want to rename it to tree.wav, one.wav. How do I rename all files to lowercase?

Macos Solutions


Solution 1 - Macos

If you're comfortable with the terminal:

  1. Open Terminal.app, type cd and then drag and drop the Folder containing the files to be renamed into the window.

  2. To confirm you're in the correct directory, type ls and hit enter.

  3. Paste this code and hit enter:

    for f in *; do mv "$f" "$f.tmp"; mv "$f.tmp" "`echo $f | tr "[:upper:]" "[:lower:]"`"; done
    
  4. To confirm that all your files are lowercased, type ls and hit enter again.

(Thanks to @bavarious on twitter for a few fixes, and thanks to John Whitley below for making this safer on case-insensitive filesystems.)

Solution 2 - Macos

The question as-asked is general, and also important, so I wish to provide a more general answer:

Simplest case (safe most of the time, and on Mac OS X, but read on):

for i in * ; do j=$(tr '[:upper:]' '[:lower:]' <<< "$i") ; mv "$i" "$j" ; done

You need to also handle spaces in filenames (any OS):

IFS=$'\n' ; for i in * ; do j=$(tr '[:upper:]' '[:lower:]' <<< "$i") ; mv "$i" "$j" ; done

You need to safely handle filenames that differ only by case in a case-sensitive filesystem and not overwrite the target (e.g. Linux):

for i in * ; do j=$(tr '[:upper:]' '[:lower:]' <<< "$i") ; [ -e "$j" ] && continue ; mv "$i" "$j" ; done 

Note about Mac OS X:

Mac's filesystem is case-insensitive, case-preserving.

There is, however, no need to create temporary files, as suggested in the accepted answer and comments, because two filenames that differ only by case cannot exist in the first place, ref.

To show this:

$ mkdir test
$ cd test
$ touch X x
$ ls -l 
total 0
-rw-r--r--  1 alexharvey  wheel  0 26 Sep 20:20 X
$ mv X x
$ ls -l 
total 0
-rw-r--r--  1 alexharvey  wheel  0 26 Sep 20:20 x

Solution 3 - Macos

A fish shell version:

for old in *
    set new (echo $old | tr '[A-Z]' '[a-z]')
    mv $old $new
end

Solution 4 - Macos

For those wanting to lowercase all files in the current directory and sub-directories:

# lower case all files in current dir & subdirs
for d in ./**/ ; do (cd "$d" &&  for x in ./*/ ; do (cd "$x" && for f in *; do mv "$f" "$f.tmp"; mv "$f.tmp" "`echo $f | tr "[:upper:]" "[:lower:]"`"; done); done); done

#list all directories
for f in ./**/ ; do echo $f; done

# lower case all files in a directory
for x in ./*/ ; do (cd "$x" && for f in *; do mv "$f" "$f.tmp"; mv "$f.tmp" "`echo $f | tr "[:upper:]" "[:lower:]"`"; done); done

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionVoloda2View Question on Stackoverflow
Solution 1 - MacoswjlView Answer on Stackoverflow
Solution 2 - MacosAlex HarveyView Answer on Stackoverflow
Solution 3 - MacosarseniusView Answer on Stackoverflow
Solution 4 - MacosVeasMKIIView Answer on Stackoverflow