[clug] renaming files to make windows happy

Nemo Thorx wombat at nemo.house.cx
Mon May 4 18:15:04 GMT 2009

On Thu, Apr 23, 2009 at 05:52:14PM +1000, Hal Ashburner did utter:
> The /portable filename characters/ as defined by ANSI C are
> a b c d e f g h i j k l m n o p q r t u v w x y z
> A B C D E F G H I J K L M N O P Q R T U V W X Y Z
> 0 1 2 3 4 5 6 7 8 9
> . _ -
> prompt$ for file in *; do echo mv "$file" $(echo -n "$file" |tr -c 
> '[a-zA-Z0-9_.-]' _ );done
> Is what I'd use, the output of which I'd check very carefully for 
> "bulletproofness" before using.
> If you've got directories with dodgy names in a hierarchy then 
> find . -name "*"; while read dir; do
>   if [ -d $dir ] 
> etc.
> I'm not sure if it's exactly what you want but I hope it helps.
> Hal Ashburner

Just to update and feed the collective wisdom...

This and other suggestions were a good start. The character set listed
was a little too limited for my needs though (I wanted the biggest
subset of characters handled by both linux commandline and win32 API
- and thus requiring minimum of changes.  

What I ended up with was a wrapper around this core:

$(echo -n "$file" |tr :\"\*?\! -\'#__ | sed -e 's/\.*$//g')

Where 'tr' translates a bunch of WIN32 unfriendly characters into win32
agreeable ones, using some guesses as to context rather than just
turning everything into an _. I then hit 'sed' up to remove any trailing

This isn't bulletproof since it's trivial to craft examples where this
still will leave a win32 unfriendly filename (I don't translate all
characters, and will leave files with trailing spaces), but for my needs
at the moment, this did me fine. 


  ------------------------------------------ --------------------------
                                                    earth native

More information about the linux mailing list