I have the following script, that will replace all spaces in files and directories recursively:
################### 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
It works by populating an array with directories:
array=( `find ./ -type d` ) # Find catalogs recursively.
If I want to force this script to work from a specific directory, could I do something like this?
array=( `find /my/start/directory/ -type d` ) # Find catalogs recursively.
I'm asking here (instead of just running it) as I want to double check it's correct, I don't want to rename every file on the server by accident!