In order to write files to a USB volume I want to rename filenames containing '?', '"', '*' or ':' to replace any of these characters with a space. But I'm having trouble with the '*'. My bash script is

for file in * 
    mv -v "'"$file"'" "'"$(echo "$file" | sed 's/\(.*\)[?"*:]\(.*\)/\1 \2/')"'" 

The '*' keeps getting expanded into the filenames in the current directory. I've tried using

set -f

but then the initial 'in *' doesn't work.


2 Answers 2


Just make sure that you quote you filenames properly and there will be no issues.

for name in ./*; do
    newname=${name//[?\"*:]/ }
    if [ "$newname" != "$name" ]; then
        mv -iv "$name" "$newname"

Your "'"$file"'" actually leaves $file completely unquoted (surrounded by single quotes, but these do not quote the variable or its value since they are themselves quoted).

See also:

Regarding your sed bit.

sed has a neat little command that many seem to overlook called y:

sed 'y/?"*:/    /'

This would change all characters in the first part of the expression to the corresponding character in the second part (here all spaces).

tr works too:

tr '?"*:' '    '

But in this case, it would be more convenient to use the built in parameter substitution facility of bash to make the changes needed.


You have some strange stuff happening with you quotes.

Start by changing the "'" to "

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .