« Back to home

Jak odstranit diakritiku z názvu souborů

Potřeboval jsem odstranit diakritiku z názvů souborů. Pod winxp s cygwinem (tr viz dále nefungoval a o příkazu unaccent jsem nevěděl). PS: Filtruji .svn adresáře. S unaccent by to bylo asi výrazně rychlejší. IFS je asi zbytečné. Umí si poradit s duplicitami. Adresáře neřeší.

Výsledek vypadá takto:

    #!/bin/bash

    srcenc=cp1250

    SAVEIFS=$IFS
    IFS=$(echo -en “\n\b”)

    if [ $# -eq 0 ];then
      echo “Usage: $0 directory …”
    else
      while [ $# -gt 0 ];do
        if [ -d “$1” ];then
          find “$1” -mindepth 1 -maxdepth 1 -type f | grep -v “.svn” | while read name;do
            echo “INFO: Filename - $name”
            nname=”$(iconv -f “$srcenc” -t “ascii//TRANSLIT” <<< “$name” )”
            nname=”$(echo “$nname” | sed -e “s/’//g” )”
            if [ “$name” != “$nname” ];then 
              if [ -e “$nname” ];then
                echo “WARNING: Filename already exist - $nname”
                i=0
                oname=”$nname”
                while [ -e “$nname” ];do nname=”$( printf “%s.%05i” “$oname” $i )”;i=$(($i+1));done
              fi
              svn rename “$name” “$nname”
            fi
          done
          find “$1” -mindepth 1 -maxdepth 1 -type d -print0 | xargs -0r “$0” | sed -e “s:[-a-zA-Z0-9_/. \]*.svn ::g”
          shift
        else
          echo “Directory $1 does not exist”
        fi
      done
    fi


    # restore $IFS
     IFS=$SAVEIF

Jiné a podobné možnosti:

TR:


    #n=”$( echo “$name” | tr — ’ĄąÁÂĂÄáâăäĆÇČćçčĎĐďđÉĘËĚéęëěÍÎíłľĹĺŃŇńňÓÔŐÖóôőöŔŕŘřŚŠŞśšşŤťŢţŮÚŰÜůúűüÝýŹŽŻźžż’\

    ‘AaAAAAaaaaCCCcccDDddEEEEeeeeIIiiLLllLlNNnnOOOOooooRrRrSSSsssTtTtUUUUuuuuYyZZZzzz’ \

    | tr -cs — ‘-0-9a-zA-Z_.\/’ ‘_’ \

    | tr -s — ‘-_’ ‘-_’ | sed -e ‘s/^[-_]+//’ -e ‘s/[-_]*-[-_]*/-/g’ -e ‘s/[-_]+././g’ -e ‘s/.[-_]+/./g;’ )”

SED

    nname=”$( echo “$name” | sed ‘y/ĄąÁÂĂÄáâăäĆÇČćçčĎĐďđÉĘËĚéęëěÍÎíłľĹĺŃŇńňÓÔŐÖóôőöŔŕŘřŚŠŞśšşŤťŢţŮÚŰÜůúűüÝýŹŽŻźžż\x9D\x9A\x9E\x8D\x8A\x8E/ AaAAAAaaaaCCCcccDDddEEEEeeeeIIiiLLllLlNNnnOOOOooooRrRrSSSsssTtTtUUUUuuuuYyZZZzzztszTSZ/; y/A-Z/a-z/;y/-0-9a-z_./_/cs;y/-_/-_/s;s/^[-_]\+//;s/[-_]*-[-_]*/-/g;s/[-_]\+.\/./g;s/.[-_]\+/./g;’ )”

    sed -e ‘y/ščř/scr/;y/-0-9a-z_./_/cs’

Zdroj a inspirace: http://www.abclinuxu.cz/blog/Tomik/2007/11/uzitecne-skripty-7-hromadne-prejmenovani-souboru/diskuse