Portál AbcLinuxu, 4. května 2025 14:21
Už několikrát se mi stalo, že jsem potřeboval v adresářovém podstromu zrušit diakritiku, popř. nahradit mezery v názvech znakem "_". Nepodařilo se mi najít nějaký program, který je k tomu určený a "ruční" přejmenovávání mě už přestalo bavit. Proto, ač nejsem zkušený programátor v shellu, jsem si zkusil udělat skript, který výše zmíněné zvládne. Nevím, na kolik je moje řešení "čisté", nicméně jsem to zkoušel a k mé radosti skript udělal, co jsem od něj očekával. Proto jsem se rozhodl dát si ho do blogu jako svůj první zápis. :o) Zároveň budu rád, když mě ti zkušenější z vás třeba upozorní na mou chybu nebo možnost lepšího řešení.
Tak tedy: Skript je rozdělen do dvou souborů. První soubor s názvem start
obsahuje jen příkaz find
, který prohledává aktuální adresář a pro každou položku spouští skript diakritika
s parametrem názvu položky:
#!/bin/bash find ./ -exec ./diakritika {} \;
Skript diakritika
vypadá nějak následovně.
#!/bin/bash if test -w "$1" then echo "-----------------------------------------------------------------" echo "Prejmenovavam soubor $1" JMENO=`echo $1 | sed 's/ě/e/g' | sed 's/š/s/g' | sed 's/č/c/g'| sed 's/ř/r/g'` JMENO=`echo $JMENO | sed 's/ž/z/g' | sed 's/ý/y/g' | sed 's/á/a/g' | sed 's/í/i/g'` JMENO=`echo $JMENO | sed 's/é/e/g' | sed 's/ú/u/g' | sed 's/ů/u/g' | sed 's/ó/o/g'` JMENO=`echo $JMENO | sed 's/ď/d/g' | sed 's/ť/t/g' | sed 's/ň/n/g'` JMENO=`echo $JMENO | sed 's/Ě/E/g' | sed 's/Š/S/g' | sed 's/Č/C/g'| sed 's/Ř/R/g'` JMENO=`echo $JMENO | sed 's/Ž/Z/g' | sed 's/Ý/Y/g' | sed 's/Á/A/g' | sed 's/Í/I/g'` JMENO=`echo $JMENO | sed 's/É/E/g' | sed 's/Ú/U/g' | sed 's/Ů/U/g' | sed 's/Ó/O/g'` JMENO=`echo $JMENO | sed 's/Ď/D/g' | sed 's/Ť/T/g' | sed 's/Ň/N/g'` JMENO=`echo $JMENO | sed 's/ /_/g'` echo "Na soubor:" echo $JMENO if [ "X$JMENO" != "X$1" ] then mv -f "$1" "$JMENO" if test -d "$JMENO" then find ./ -exec diakritika {} \; fi fi else echo "Nemas prava menit soubor/adresář!" echo "-----------------------------------------------------------------" fi
Na začátku skript otestuje, zda je povolen soubor/adresář pro zápis. Pokud ano, odstraní háčky a čárky (náhradí se písmenem bez háčku/čárky), mezeru nahradí podtržítkem. Pokud je nový název různý od starého (soubor obsahoval diakritiku) přejmenuje soubor/adresář na nové jméno. Na problém jsem narazil, když měněnou položkou byl adresář. U adresáře, který obsahoval diakritiku, se diakrikika odstranila, ale skript už dál neprocházel jeho podstrom. To vyřešil poslední test -- je-li měněnou položkou adresář, je v podstatě znovu spuštěn start
. Řádky začínající echo
pouze vypisují, s čím skript pracuje a jejich smazáním by se možná urychlil (nevím, možná ne).
Ještě bych dodal, že skript samozřejmě nenahrazuje veškerou diakritiku, ale jen tu běžně používanou v češtině (snad jsem na něco nezapomněl). Další náhrady by se ale daly dopsat. Skript jsem testoval jen na malém podstromu asi o třech úrovních, takže nevím, jak bude pracovat při složitějších strukturách.
Pro použití skriptu stačí oba soubory nahrát do adresáře, v jehož podstromu chceme odstranit diakritiku a spustit ./start
Budu rád za vaše náměty na lepší řešení. Bude-li někdo skript zkoušet -- doporučuji nejprve na neškodných datech. Jak jsem psal v úvodu, nejsem v žádném případě zkušený programátor v shellu, a proto nevím, zda nemůže mít tento skript "vedlejší účinky"...
Tiskni
Sdílej:
#!/bin/bash function strip_diak { echo "$1" | tr 'ěščřž ..' 'escrz_..' } function diak { new_name="$( strip_diak "$1" )" mv -f "$1" "$new_name" || return 1 cd "$new_name" || return 1 for fajl in *; do if [[ -d "$fajl" ]]; then diak "$fajl" else new_name="$( strip_diak "$fajl" )" if [[ "$new_name" != "$fajl" ]]; then mv -f "$fajl" "$new_name" || echo "mv error" && return 1 fi fi done return 0 } diak "${1:-$PWD}" || exit 1 exit 0
echo "$1" | tr 'ěščřž ..' 'escrz_..'zapsat, ze chci prelozit patricne unikodove znaky jako jsou äåöõü atd.
find -print
nedokaze korektne vyporadat s whitespaces v nazvech souboru - nebylo by lepsi pouzit find -print0 | xargs --null
?
Tak jak tak: diky za prispevek, podle me je cennejsi komplet zdrbnout tvuj kod a vymyslet lepsi, nez mlcet a nechat vsechny, at znovu vynalezaji kolo! B-)
-f
je špatné, špatné, špatné ...
... mamííí, ploč ťam má ťeň páň -f
míšto -i
? ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.