With rename it is possible to bulk change filenames. I managed to get rid of all + with this command and replace them with underscores:
rename 's/\+/_/g' * I could change normal letters like a to A with.
rename 's/a/A/g' * but I could not rename the ?, not like this /\? and not like this /?.
Is there any way to adress the "?" in the filename? Most FTP programs fail to rename files with ? as well. Midnight Commander fails. The only way I found that works so far is:
mv ?myfile.txt myfile.txt but this command is not flexible enough. I would prefer to bulk rename all ? in all files.
5 Answers
How about this:
for filename in * do if [ "$filename" == *"?"* ] then mv "$filename" "$(echo $filename | tr '?' '-')" fi done Or as a one liner:
for filename in *; do mv "$filename" "$(echo $filename | tr '?' '-')" ; done However, it looks like your issue isn't that there are question marks in your filenames, but rather that your filenames contain characters that ls doesn't recognize.
It's ugly, but here it goes, a one liner using Python:
python -c 'import os, re; [os.rename(i, re.sub(r"\?", "-", i)) for i in os.listdir(".")]' As for cleaning up file names, maybe this will help you:
python -c 'import os, re; [os.rename(i, unicode(i, "utf-8", "ignore")) for i in os.listdir(".")]' Use this code
for file in ./*; do OUT=`echo $file | sed 's/\r//g'`; mv $file $OUT; done Apparently \r matches ? in sed.
The ? char can be tricky to match. And i did not get lucky with rename. To avoid mismatches in encoding I found it easier to deal with the output of dir.
In my case the ? then turns out to be a \303\202. We still need to escape the \ with another \\
Finally iterating over all files
for i in *; do mv $i $(echo $i | tr \\303\\202 _); done This may be overkill but with the bash script in the link provided in this answer you can rename a filename with any characters in it including question marks, newlines, multibyte characters, spaces, dashes and any other allowable character: