# torn - Musical files renaming with russian language transliteration # Copyright (C) 2021-2024 Sergey Matveev (stargrave@stargrave.org) # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, version 3 of the License. # Initially this script was written on Perl, but now it is Z shell # function, that is intended to be used with zmv command. It is much # more flexible to be used with zsh'es glob expansion. # # * transliterates everything # * replaces non FAT-compatible characters with underscores # * replaces spaces with underscores # * lowercases file's extension # * replaces "_-_" with single dash # * removes spaces before and after brackets # * removes space after comma # * removes "[]" brackets # * replaces ampersand with "and" word # # You can run like that: # $ fpath=(... $fpath) # $ autoload torn # $ zmv "*" '`torn $f`" # # Transliteration function is separate tornt(), so you can use only # its abilities: # $ torn # assume that it is not autoloaded # $ zmv "*" '`tornt $f`' # # torna() replaces non FAT-compatible characters with underscores. # # Recursively dive into subdirectories: # $ zmv -Q "(**/)*(.)" '`torn $f`' tornt() { local n=$1 local rusS=абвгдеёзийклмнопрстуфхцьъыэ local engS=abvgdeezijklmnoprstufhcjjye for i ({1..${#rusS}}) { eval n=\${n:gs/${rusS[$i]}/${engS[$i]}} eval n=\${n:gs/${(U)rusS[$i]}/${(U)engS[$i]}} } local rusL=( ж ч ш щ я ю Ж Ч Ш Щ Я Ю) local engL=(zh ch sh sch ja ju Zh Ch Sh Sch Ja Ju) for i ({1..${#rusL}}) eval n=\${n:gs/${rusL[$i]}/${engL[$i]}} print -- $n } tornm() { local n=$1 n=${n:gs/ /_} n=${n//_[–-]_/-} n=${n//_[–-]/-} n=${n//[–-]_/-} n=${n:gs/,_/,} n=${n//[\[\]]/} n=${n:gs/_(/(} n=${n:gs/-(/-} n=${n:gs/(_/(} n=${n:gs/)_/-} n=${n:gs/_)/)} n=${n:gs/&/and} [[ $n =~ "\." ]] && n=${n:r}.${(L)n:e} [[ $n =~ "^([[:digit:]]+)[-.]_*(.+)$" ]] && n="$match[1].$match[2]" print -- $n } torna() { local n=$1 setopt REMATCH_PCRE for i ({1..${#n}}) { [[ ${n[$i]} =~ "[[:ascii:]]" ]] || n[$i]=_ [[ ${n[$i]} =~ "[[:print:]]" ]] || n[$i]=_ [[ ${n[$i]} =~ "[^,+/:;<=>?[]|]" ]] || n[$i]=_ } print -- $n } [[ -n $1 ]] || return local n=${1:t} n=`tornm $n` n=`tornt $n` n=`torna $n` print -- ${1:h}/$n