Rename a question mark (?) in filenames

2

1

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.

Morton

Posted 2013-04-09T06:13:04.000

Reputation: 21

3I can remove files with true ? without any trouble - just quote them as rm "?.txt". Are you sure it is really ? ? Maybe it is some binary character that is displayed by your shell as ? ? – mvp – 2013-04-09T06:24:35.700

3Can you indicate which rename tool it is that you are using (rename --version)? There are several different rename implementations out there. – Adrian Frühwirth – 2013-04-09T16:54:30.367

Can you provide more detail on what these file names look like? e.g., are the unknown characters always at the beginning of the filename? – ForeverWintr – 2013-04-09T17:17:57.560

Answers

5

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.

ForeverWintr

Posted 2013-04-09T06:13:04.000

Reputation: 859

Thanx 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 – 2013-04-09T07:58:20.627

one 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 "?" – Morton – 2013-04-09T08:05:33.347

6

Don't do this (Why you shouldn't parse the output of ls(1))!

– Adrian Frühwirth – 2013-04-09T16:52:32.203

3

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(".")]'

Cristian Ciupitu

Posted 2013-04-09T06:13:04.000

Reputation: 4 515

0

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:

https://superuser.com/a/858671/365691

A.Danischewski

Posted 2013-04-09T06:13:04.000

Reputation: 101