I would like to change a file extension from *.txt to *.text . I tried using the basename command, but I'm having trouble on changing more than one file.

So here is my code

files=`ls -1 *.txt`

for x in $files
do
    mv $x "`basename $files .txt`.text"
done

I'm getting this error

basename: too many arguments Try basename --help' for more information
Best Answer


Straight from Greg's Wiki .

# Rename all *.txt to *.text
for f in *.txt; do
    mv -- "$f" "${f%.txt}.text"
done

*.txt is a globbing pattern , using * as a wildcard to match any string. *.txt matches all filenames ending with '.txt'.

-- marks the end of the option list . This removes problems with filenames starting with hyphens

${f%.txt} is a parameter expansion , replaced by the value of the f variable with .txt removed from the end.

Also see the entry on why you shouldn't parse ls .

If you have to use basename , your syntax would be.

for f in *.txt; do
    mv -- "$f" "$(basename -- "$f" .txt).text"
done