Background
Three years ago, I wrote Used More Bash Utilities for batch renaming files. One of my Facebook friends has pointed out that it fails for file names containing whitespace.
Problem
Recently, I would like to remove the extension name .sh
of all shell scripts
in ~/bin
, so that which {script}
will work without .sh
.
Method
A for
loop over $(ls)
is a basic solution, but find
is more correct since it’s possible that a file name contains a space character.
find ~/bin -maxdepth 1 -name "*.sh" -type f -print0 |\
while read -d $'\0' file; do
mv $file ${file%.*}
done
A list of matching files is piped to the while
loop which iterates through
each item delimited by the null character '\0'
. The shell expansion
${file%.*}
trim off the file extension.