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.txtbut 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
doneOr as a one liner:
for filename in *; do mv "$filename" "$(echo $filename | tr '?' '-')" ; doneHowever, 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;
doneApparently \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: