renamer script help..

Johnny Rosenberg gurus.knugum at gmail.com
Sun Feb 21 15:47:56 UTC 2010


2010/2/21 Vadkan Jozsef <jozsi.avadkan at gmail.com>:
> The script:
> http://pastebin.ca/1804613
>
> but it's not working too well:
> http://pastebin.ca/1804612
>
> e.g.: the script makes "arviztur-ukorfurogep" from "árvíztűrő
> tükörfúrógép", when it should be: "arvizturo-tukorfurogep"
>
> Has someone a similar script, that works?
>
> thanks:\
> ps.: i tried it under lucid, dash is not installed as /bin/sh..
>
>
> --
> ubuntu-users mailing list
> ubuntu-users at lists.ubuntu.com
> Modify settings or unsubscribe at: https://lists.ubuntu.com/mailman/listinfo/ubuntu-users
>

Here is the script you used, I put some comments after some lines:
#!/bin/bash

## Usage e.g.: sh renamer.sh "/home/user/Desktop/somedir"

if [ "$1" == "" ]; then echo "error: no directory name given"; exit 1; fi
if ! cd "$1"; then echo "error: can't cd into dir"; exit 1; fi

function renamefiles {

rename -- 'y/A-Z/a-z/' *;

rename -- 's/á/a/g' *;
rename -- 's/í/i/g' *;
rename -- 's/ű/u/g' *;
rename -- 's/ő/o/g' *;
rename -- 's/ü/u/g' *;
rename -- 's/ö/o/g' *;
rename -- 's/ú/u/g' *;
rename -- 's/ó/o/g' *;
rename -- 's/é/e/g' *;
rename -- 's/Á/a/g' *;
rename -- 's/Í/i/g' *;
rename -- 's/Ű/u/g' *;
rename -- 's/Ő/o/g' *;
rename -- 's/Ü/u/g' *;
rename -- 's/Ö/o/g' *;
rename -- 's/Ú/u/g' *;
rename -- 's/Ó/o/g' *;
rename -- 's/É/e/g' *;

rename -- 's/_-_/-/g' *;
rename -- 's/_/-/g' *;
rename -- 's/ /-/g' *;

rename -- "s/'//g" *;
rename -- 's/\"//g' *;

rename -- 's/!//g' *;
rename -- 's/,//g' *;
rename -- 's/\(//g' *;
rename -- 's/\)//g' *;
rename -- 's/&/-and-/g' *;
rename -- 's/\*/-/g' *;
rename -- 's/\\/-/g' *;
rename -- 's/\$/-/g' *;
rename -- 's/\?//g' *;
rename -- 's/#/-/g' *;

rename -- 's/;/-/g' *;
rename -- 's/,/-/g' *;

rename -- 's/.-/-/g' *; # Here is where the ”o” disappears.
rename -- 's/-./-/g' *; # Here is where the ”t” disappears.
rename -- 's/-.-/-/g' *; # In some cases a character will disappear here too.
rename -- 's/\+/-/g' *;
rename -- 's/%/-/g' *;

rename -- 's/--------/-/g' *;
rename -- 's/-------/-/g' *;
rename -- 's/------/-/g' *;
rename -- 's/-----/-/g' *;
rename -- 's/----/-/g' *;
rename -- 's/---/-/g' *;
rename -- 's/--/-/g' *;
rename -- 's/-$//g' *;
rename -- 's/^-//g' *;

}

for i in {0..10000}; do find . -mindepth $i -maxdepth $i -type d |
while read f; do $(cd "$f"; renamefiles); done; done

I'll repeat the faulty lines:
rename -- 's/.-/-/g' *;
rename -- 's/-./-/g' *;
rename -- 's/-.-/-/g' *;

As far as I know ”.” means ”any character”. It seems like the author
means to remove an actual dot (”.”), and in that case a ”\” is
required, like this:
rename -- 's/\.-/-/g' *;
rename -- 's/-\./-/g' *;
rename -- 's/-\.-/-/g' *;

So here's the whole script now:
#!/bin/bash

## Usage e.g.: sh renamer.sh "/home/user/Desktop/somedir"

if [ "$1" == "" ]; then echo "error: no directory name given"; exit 1; fi
if ! cd "$1"; then echo "error: can't cd into dir"; exit 1; fi

function renamefiles {

rename -- 'y/A-Z/a-z/' *;

rename -- 's/á/a/g' *;
rename -- 's/í/i/g' *;
rename -- 's/ű/u/g' *;
rename -- 's/ő/o/g' *;
rename -- 's/ü/u/g' *;
rename -- 's/ö/o/g' *;
rename -- 's/ú/u/g' *;
rename -- 's/ó/o/g' *;
rename -- 's/é/e/g' *;
rename -- 's/Á/a/g' *;
rename -- 's/Í/i/g' *;
rename -- 's/Ű/u/g' *;
rename -- 's/Ő/o/g' *;
rename -- 's/Ü/u/g' *;
rename -- 's/Ö/o/g' *;
rename -- 's/Ú/u/g' *;
rename -- 's/Ó/o/g' *;
rename -- 's/É/e/g' *;

rename -- 's/_-_/-/g' *;
rename -- 's/_/-/g' *;
rename -- 's/ /-/g' *;

rename -- "s/'//g" *;
rename -- 's/\"//g' *;

rename -- 's/!//g' *;
rename -- 's/,//g' *;
rename -- 's/\(//g' *;
rename -- 's/\)//g' *;
rename -- 's/&/-and-/g' *;
rename -- 's/\*/-/g' *;
rename -- 's/\\/-/g' *;
rename -- 's/\$/-/g' *;
rename -- 's/\?//g' *;
rename -- 's/#/-/g' *;

rename -- 's/;/-/g' *;
rename -- 's/,/-/g' *;

rename -- 's/\.-/-/g' *;
rename -- 's/-\./-/g' *;
rename -- 's/-\.-/-/g' *;
rename -- 's/\+/-/g' *;
rename -- 's/%/-/g' *;

rename -- 's/--------/-/g' *;
rename -- 's/-------/-/g' *;
rename -- 's/------/-/g' *;
rename -- 's/-----/-/g' *;
rename -- 's/----/-/g' *;
rename -- 's/---/-/g' *;
rename -- 's/--/-/g' *;
rename -- 's/-$//g' *;
rename -- 's/^-//g' *;

}

for i in {0..10000}; do find . -mindepth $i -maxdepth $i -type d |
while read f; do $(cd "$f"; renamefiles); done; done

I am still confused about some things, since I am a script beginner myself:
if ! cd "$1"; then echo "error: can't cd into dir"; exit 1; fi

Does this really work? I am not sure it does, because when I
accidently typed the wrong path I didn't get that message. Instead it
started to change file names in the current directory…

And the last line:
for i in {0..10000}; do find . -mindepth $i -maxdepth $i -type d |
while read f; do $(cd "$f"; renamefiles); done; done

There has to be a better way than ”for i in {0..10000};”, not?

Regards

Johnny Rosenberg




More information about the ubuntu-users mailing list