Recursively replace spaces with underscores in file and directory names
A safe solution to recursively replace spaces with underscores in file and directory names starting from the current directory.
Example
tree . |-- a dir | `-- file with spaces.txt `-- b dir |-- another file with spaces.txt `-- yet another file with spaces.pdf
becomes:
tree . |-- a_dir | `-- file_with_spaces.txt `-- b_dir |-- another_file_with_spaces.txt `-- yet_another_file_with_spaces.pdf
Code
- Name: space_to_underscore.sh
- Description: Recursively replace spaces with underscores in file and directory names.
- Language: BASH
#!/bin/bash
#=============================================================#
# Name: Space to Underscore #
# Description: Recursively replace spaces with underscores #
# in file and directory names. #
# Version: ver 1.2 #
# Data: 16.6.2014 #
# Author: Arthur Gareginyan #
# Author URI: https://www.arthurgareginyan.com #
# License: GNU General Public License, version 3 (GPLv3) #
# License URI: http://www.gnu.org/licenses/gpl-3.0.html #
#=============================================================#
# USAGE:
# chmod +x space_to_underscore.sh
# cd /home/user/example
# ~/space_to_underscore.sh
# Check for proper priveliges
[ "`whoami`" = root ] || exec sudo "$0" "$@"
####################### DIALOG ############################
echo -en "\n BEWARE! Starting from current directory (`pwd`),"
echo -en " files and directories with spaces in name will be renamed automatically.\n"
echo -en "\n Press \"ENTER\" to continue or \"N\" to exit:"
read ops
case "$ops" in
n|N)
echo -en "\n Canceled by User. Exiting...\n"
exit 1 ;;
*)
echo -en "\n Begining...\n" ;;
esac
################### SETUP VARIABLES #######################
number=0 # Number of renamed.
number_not=0 # Number of not renamed.
IFS=$'\n'
array=( `find ./ -type d` ) # Find catalogs recursively.
######################## GO ###############################
# Reverse cycle.
for (( i = ${#array[@]}; i; )); do
# Go in to catalog.
pushd "${array[--i]}" >/dev/null 2>&1
# Search of all files in the current directory.
for name in *
do
# Check for spaces in names of files and directories.
echo "$name" | grep -q " "
if [ $? -eq 0 ]
then
# Replacing spaces with underscores.
newname=`echo $name | sed -e "s/ /_/g"`
if [ -e $newname ]
then
let "number_not +=1"
echo " Not renaming: $name"
else
# Plus one to number.
let "number += 1"
# Message about rename.
echo "$number Renaming: $name"
# Rename.
mv "$name" "$newname"
fi
fi
done
# Go back.
popd >/dev/null 2>&1
done
echo -en "\n All operations is complited."
if [ "$number_not" -ne "0" ]
then echo -en "\n $number_not not renamed."
fi
if [ "$number" -eq "0" ]
then echo -en "\n Nothing been renamed.\n"
elif [ "$number" -eq "1" ]
then echo -en "\n $number renamed.\n"
else echo -en "\n Renamed files and catalogs: $number\n"
fi
exit 0
Usage
Give execute permissions:
chmod +x space_to_underscore.sh
Go to needed directory:
cd /home/user/example
Run the space_to_underscore.sh
which placed in user home directory:
~/space_to_underscore.sh
Arthur Gareginyan
Arthur is a designer and full stack software engineer. He is the founder of Space X-Chimp and the blog My Cyber Universe. His personal website can be found at arthurgareginyan.com.
Follow Arthur