nutools/fnconv

102 lines
2.7 KiB
Bash
Executable File

#!/bin/bash
# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
function display_help() {
uecho "$scriptname: renommer des fichiers en changeant leur encoding
USAGE
$scriptname [-f src_enc] [ -t dest_enc] [/path/to/file]
OPTIONS
-f from
Encoding source. Si n'est pas spécifié ou vaut 'detect', l'encoding est
autodétecté.
-t to
Encoding destination. Doit être spécifié.
-N Ne pas optimiser le calcul de l'encoding. Cette option n'est valide que
si -f n'est pas spécifié. On assume que tous les noms de fichiers n'ont
pas le même encoding. L'encoding from est donc recalculé à chaque fois.
-r inverser from et to, qui doivent être tous les deux spécifiés."
}
if [ "$#" -eq 1 -a "$1" == --nutools-makelinks ]; then
# créer les liens
scriptname="$(basename "$0")"
for destenc in latin1 utf8; do
ln -s "$scriptname" "${scriptname}2$destenc"
done
exit 0
fi
source "$(dirname "$0")/ulib/ulib" &&
urequire DEFAULTS ||
exit 1
from=detect
case "${scriptname#fnconv2}" in
utf8) to=utf-8;;
latin1) to=iso-8859-1;;
*) to=;;
esac
optimize=1
parse_opts "${PRETTYOPTS[@]}" \
--help '$exit_with display_help' \
-f: from= \
-t: to= \
-N optimize= \
-r reverse \
@ args -- "$@" && set -- "${args[@]}" || die "$args"
function fnconv() {
# $1 = fichier à renommer
local lfrom="$from" lto="$to"
local srcdir="$(dirname "$1")"
local srcname="$(basename "$1")"
if [ "$lfrom" == "detect" ]; then
lfrom="$("$scriptdir/lib/pywrapper" uencdetect.py "$srcname")"
if [ "$lfrom" == "Unknown" ]; then
eerror "$srcname: Impossible de déterminer l'encoding"
return 1
fi
if [ -n "$optimize" ]; then
from="$(__norm_encoding "$lfrom")"
[ "$from" != "$to" ] && enote "Conversion $from --> $to"
fi
fi
if [ -n "$optimize" -a "$from" == "$to" ]; then
die "Une conversion de $from à $to n'a pas de sens.
Veuillez re-essayer avec -N si nécessaire."
fi
if [ -n "$reverse" ]; then
tmp="$lto"
lto="$lfrom"
lfrom="$tmp"
fi
local src="$(abspath "$srcdir/$srcname")"
local dest
dest="$srcdir/$(iconv -f "$lfrom" -t "$lto" <<<"$srcname")" || return 1
dest="$(abspath "$dest")"
if [ "$src" != "$dest" ]; then
ebegin "$(ppath "$src") --> $(basename "$dest")" \
mv "$src" "$dest"
fi
src="$dest"
if [ -d "$src" ]; then
etitle -s "$(ppath "$src")"
local subsrcs subsrc
array_lsall subsrcs "$src"
for subsrc in "${subsrcs[@]}"; do
fnconv "$subsrc"
done
eend
fi
}
[ -n "$to" ] || die "Il faut spécifier l'encoding de destination"
to="$(__norm_encoding "$to")"
for src in "$@"; do
fnconv "$src"
done