Ékezetes fájl és mappa nevek átnevezése angol karakterekre rekurzívan?

Fórumok

Helló

Tudnátok segíteni, milyen módon tudok sok magyar ékezetes fájlnevet és mappa nevet átnevezni ékezet mentesre? A szóközt alsó vonalra, a ... -ot semmire, satöbbi.

A legjobb lenne valami program vagy shell script, ami ezt végrehajtaná.

Ha ékezetes mappában van az ékezetes fájl, akkor vagy a fájlok után kellene a mappát átnevezni, vagy kétszer lefuttatni ezt.

Futtatnám egy adott mappában amiben vannak az ékezetes fájlok és mappák egymás alatt. Ubuntu Linuxon.

Köszi a javaslatokat.

Hozzászólások

Szerkesztve: 2022. 04. 12., k – 12:30

Szia!

Shell szkriptekkel:

Mappa átnevezéshez

#!/bin/bash

## Rekúrzív mappa átnevező
## Eltávolítja a nevekből az ékezetes karaktereket, zárójeleket, plusz jelet, írásjeleket
## A szóközöket _-sal helyettesíti
## A nevet kiegészíti egy random 4 jegyű karaktersorral a név végén, hogy névegyezés esetén se legyen probléma

function dodir() {
    echo "$1"
    pushd "$1" >> /dev/null
    for x in *; do
        if [ -d "$x" ]; then #A feltétel biztosítja, hogy csak mappákon fut le!

            RndChar=`cat /proc/sys/kernel/random/uuid | sed 's/[-]//g' | head -c 4` # Random azonosító generátor a fájl végére

            trans=`echo "$x" | sed 's/[+\(\)\!\?]//g' | sed 's/[...]/ /g' | sed 's/,/_/g' | sed 's/ \+/ /g' | sed 's/\. /_/g' | sed 's/ /_/g' | sed 's/_\+/_/g'`
            # sed 's/ \+/ /g' : Ha egy vagy több szóköz követi egymást, akkor egyre redukálja, majd azt az egyet _-ra cseréli
            # sed 's/ /_/g' : A szóközöket _-ra cseréli
            # FIGYELJ! A sed 's/\. /_/g fájloknál problémát okozhat, mert a kiterjesztés előtti pontot lecseréli, ha _ előzi meg 
            trans=`echo "$trans" | sed 'y/éáóüűúöőóíÉÁÓÖŐÜŰÚÓÍ/eaouuuoooiEAOOOUUUOI/'`

            
            if [ "$trans" != "$x" ]; then

                mv -v "$x" "$trans"_"$RndChar"

                if [ -d "$trans" ]; then
                    dodir "$trans"
                fi
            else
                if [ -d "$x" ]; then
                    dodir "$x"
                fi
            fi
        fi
    done
    popd >> /dev/null
};
 
dodir "$1"

Fájl átnevezéshez

#!/bin/bash

## Rekúrzív fájl átnevező
## Eltávolítja a nevekből az ékezetes karaktereket, zárójeleket, plusz jelet, írásjeleket
## A szóközöket _-sal helyettesíti

function dodir() {
    pushd "$1" >> /dev/null
    for x in *; do

            trans=`echo "${x%.*}" | sed 's/[+\(\)\!\?]//g' | sed 's/,/_/g' | sed 's/\s\+/ /g' | sed 's/\./_/g' | sed 's/\s/_/g' | sed 's/;/_/g' | sed 's/_\+/_/g'`
            # sed 's/\s\+/ /g' : Ha egy vagy több szóköz követi egymást, akkor egyre redukálja, majd azt az egyet _-ra cseréli
            # sed 's/\s/_/g' : A szóközöket _-ra cseréli 
            trans=`echo "$trans" | sed 'y/éáóüűúöőóíÉÁÓÖŐÜŰÚÓÍ/eaouuuoooiEAOOOUUUOI/'`

            trans="$trans"."$(echo ${x##*.})" # Hozzáfűzi az átalakított fájlnévhez a kiterjesztést

             if [ "$trans" != "$x" ]; then

                if [ -f "$x" ]; then
                
                    mv -n -v "$x" "$trans" # Nem írja felül a fájlt, ha az új néven már van létező fájl
                fi

                if [ -d "$x" ]; then
                    dodir "$x"
                fi

            fi

    done
    popd >> /dev/null
};
 
dodir "$1"

Nemrég hasonló problémám volt. Nem tudom, máshol is lehet-e ilyen egyszerűen, de C#-ban ennyi az egész:

Regex.Replace(s.ToLowerInvariant().Normalize(NormalizationForm.FormKD), @"\.[a-z]+$|[^a-z0-9]+", "")

Minden ékezetet, speciális karaktert, szóközt, és az utolsó kivételével pontot töröl (és mivel Windows környezetben kellett, mindent kisbetűsre is cserél).

Működése: ./dodir [mappa útvonal]
Megjegyzés: Ebben a mappában és almappáiban történik a mappák átnevezése

Működése: ./dofile [mappa útvonal]
Megjegyzés: Ebben a mappában és almappáiban történik a fájlok átnevezés

Az ékezetmentesítésnél probléma szokott lenni, hogy több különböző fájlnévből ugyan az az átkódolt név keletkezik, és így felülírhatják a korábbit. pl.:

fájlnév.jpg  (utf-8) -> fajlnev.jpg

fájlnév.jpg  (iso8859-2) -> fajlnev.jpg

fajlnev.jpg  (ékezetmentes) -> fajlnev.jpg

A makró lehet pl.: %f%e%k(áé,ae)%r( ,_)%r(...,)

Ha a http://sign-el-soft.hu/cgi/ng-xim.html#filecopy megoldást használod, akkor az rákérdez az első ütközésnél. Ha ekkor azt választod, hogy kihagyja mindet, akkor a végén azok maradnak kijelölve, amik kimaradtak.

Módosítani kell a makrót pl.:%f-v1%e%k(áé,ae)%r( ,_)%r(...,) és újra indítani.

A detox bevált, köszi bzs, viszont egy dolgot nem tesz meg: ha a mappa neve pontra ( . ) végződik "Hello_-Ez_van.", akkor azt nem veszi figyelembe, és gond, ha úgy végződik, mert NTFS esetén nem tudom a mappát átmozgatni, stb.

Milyen módon tudnám a mappák neve végéről a pontot eltávolítani biztonságosan, rekurzívan?