Rename a question mark (?) in filenames
Solution 1
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.
Solution 2
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(".")]'
Solution 3
Use this code
for file in ./*;
do
OUT=`echo $file | sed 's/\r//g'`;
mv $file $OUT;
done
Apparently \r
matches ?
in sed.
Solution 4
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
Related videos on Youtube
Morton
Updated on September 18, 2022Comments
-
Morton over 1 year
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.-
mvp about 11 yearsI can remove files with true
?
without any trouble - just quote them asrm "?.txt"
. Are you sure it is really?
? Maybe it is some binary character that is displayed by your shell as?
? -
Adrian Frühwirth about 11 yearsCan you indicate which
rename
tool it is that you are using (rename --version
)? There are several differentrename
implementations out there. -
ForeverWintr about 11 yearsCan you provide more detail on what these file names look like? e.g., are the unknown characters always at the beginning of the filename?
-
-
Morton about 11 yearsThanx for the fast reply. is this a bash script? I tried it as ubuntu bash and it did not change anything: #!/bin/bash for filename in $(ls | grep ?) do mv $filename $(echo $filename | tr '?' '-') done
-
Morton about 11 yearsone more thing that might be important: if I list the directory with "ls" the ? in the filenam eis displayed like this: ?%84nderung.pdf but if I use "dir" it is displayed like this : \303%84nderung.pdf I know the whole problem originates from a bad UTF-8 conversion. But maybe I have to search for "\303" instead of "?"
-
Adrian Frühwirth about 11 yearsDon't do this (Why you shouldn't parse the output of ls(1))!
-
gone over 3 years
\r
also matchesr
.