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.
- 481 megtekintés
Hozzászólások
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"
- A hozzászóláshoz be kell jelentkezni
sed 'y/éáóüűúöőóíÉÁÓÖŐÜŰÚÓÍ/eaouuuoooiEAOOOUUUOI/'
Hogy ez mennyivel egyszerűbb, mint POSIX "equivalence class"-okkal bajlódni. (`[=o=] ~ o ó ö ő` stb.) *arctenyér* :D
- A hozzászóláshoz be kell jelentkezni
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).
- A hozzászóláshoz be kell jelentkezni
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
- A hozzászóláshoz be kell jelentkezni
Nagyon köszönöm, ki is próbálom!
- A hozzászóláshoz be kell jelentkezni
Én erre a detoxot használom. Ezt rekurzíve lefuttatod osztjóvan.
10-féle lény van:
-- aki ismeri a bináris számrendszert,
-- és amelyik nem.
- A hozzászóláshoz be kell jelentkezni
Ez is nagyon jónak tűnik, nem hallottam erről.
- A hozzászóláshoz be kell jelentkezni
Nagy Gábor https://sign-el-soft.hu
- A hozzászóláshoz be kell jelentkezni
Kipróbálom ezt is, megírom majd, melyik lett a legjobb.
- A hozzászóláshoz be kell jelentkezni
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.
Nagy Gábor https://sign-el-soft.hu
- A hozzászóláshoz be kell jelentkezni
erre miért is nem jó egy find -exec?
De amúgy itt egy ugyanilyen topic: https://hup.hu/node/76029
- A hozzászóláshoz be kell jelentkezni
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?
- A hozzászóláshoz be kell jelentkezni
Már kaptál rá választ: dodir szkript
- A hozzászóláshoz be kell jelentkezni