#!/bin/sh # a script to traverse a directory tree and convert # file and directory names to target (current by default) # charset, auto-guessing source charset given the language # (c) 2006, Michael Shigorin # use freely usage() { echo "A script to traverse a directory tree and convert" >&2 echo "file and directory names to target charset using" >&2 echo "source charset autoguesser (defaulting to locale's" >&2 echo "language and charset if none specified)" echo >&2 echo "Usage: $0 [-L language] [-x charset] [-r] [-q] []" >&2 echo " -L and -x take parameters just as enca(1)" >&2 echo " -r turns on recursion" >&2 echo " -q means quiet" >&2 exit 1 } fatal() { echo $0: $* >&2 exit 1 } process() { new="$(echo $1 | enca -L "$language" -x "$charmap" || failed="$1")" [ -z "$new" ] && fatal "$1 results in EMPTY converted name!" [ "$1" != "$new" ] && { [ -e "$new" ] && { echo "$0: $1 already exists with recoded name: $new, leaving as is" >&2 } || $wrapper mv "$verbose" "$1" "$new" } } traverse() { [ -d "$1" ] && { obj=.; dir="$1"; } || { obj="$1"; dir=.; } pushd "$dir" >/dev/null || return ls "$obj" | while read i; do [ ! -L "$i" -a -d "$i" -a -n "$recurse" ] && traverse "$i" process "$i" done popd >/dev/null } ### main() TEMP=`getopt -l language:,charset:,recurse,notest,quiet,help -- +L:x:r:N:q:h "$@"` || usage eval set -- "$TEMP" eval `locale -k charmap` # $charmap is current charset # alas, language code isn't that easy [ -z "$LC_CTYPE" ] && eval `locale 2>/dev/null | grep ^LC_CTYPE` language="`echo $LC_CTYPE | cut -c1-2`" verbose="-v" recurse= wrapper="echo" failed= while :; do case "$1" in --) shift; break ;; -L|--language) shift; language="$1" ;; -x|--charset) shift; charmap="$1" ;; -r|--recurse) recurse=1 ;; -N|--notest) wrapper= ;; -q|--quiet) verbose= ;; -h|--help) usage ;; *) [ -e "$1" ] && break || fatal "Unrecognized option: $1" ;; esac shift done [ -z "$language" ] && fatal "need -L language, unable to guess from locale" [ -z "$charmap" ] && fatal "need -x charset, unable to guess from locale" [ -n "$1" ] && { [ -e "$1" ] && traverse "$1" || fatal "$1 not found" } || usage [ -n "$wrapper" -a -z "$failed" ] && echo "seems good, now run me with --notest to actually rename" [ -n "$failed" ] && fatal "$failed name failed to convert, please check"