Skip to content

How to replace all filenames with space with underscore using a shell script

I had to replace all filenames in a folder, recursively, with space with underscore.

This is one of the one-off operations I need to do while working on my website, and I don’t really want to, for example, search, install (buy) an app just to do that.

Here’s the Fish Shell script I used:

#!/opt/homebrew/bin/fish

# define the directory to search
set search_dir ./

# recursively find all files in the search directory
find $search_dir -type f | while read -l file
    # replace spaces with underscores in the file name
    set new_name (echo $file | tr ' ' '_')

    # rename the file
    mv $file $new_name
end

I put this in the folder containing all the files and folders I wanted to rename, named replace_spaces.fish.

Then I set it as executable using chmod +x replace_spaces.fish and finally ran it using ./replace_spaces.fish.


→ Here's my latest YouTube video

→ Get my Linux Command Line Handbook

→ I wrote 17 books to help you become a better developer, download them all at $0 cost by joining my newsletter

JOIN MY CODING BOOTCAMP, an amazing cohort course that will be a huge step up in your coding career - covering React, Next.js - next edition February 2025

Bootcamp 2025

Join the waiting list