Может делать имена большими буквам, маленькими буквами, большими первыми буквами каждого слова.
Требует GNU sed, работает с Юникодом.
#!/bin/bash
set -e
set -u
ACTION='no'
FORCE='no'
UPPER='no'
CAPS='no'
SCRIPT=$(basename "$0")
usage ()
{
cat <<USAGE
Usage: $SCRIPT [options] files...
Renames files to lower or upper case.
Default is to rename to lower case.
Uses GNU sed. Tested with sed v4.1.5
Options are:
-A Do actual work ($ACTION)
-F Force renaming if files exist ($FORCE)
-u Rename to upper case instead of lower ($UPPER)
-c Make first letters caps ($CAPS)
-h, -? This help message
Examples:
# $SCRIPT EE/*
mv "EE/RBwrwRW" "EE/rbwrwrw"
mv "EE/УМЦУУкцускцу" "EE/умцуукцускцу"
# $SCRIPT -u ee/*
mv "ee/RBwrwRW" "ee/RBWRWRW"
mv "ee/УМЦУУкцускцу" "ee/УМЦУУКЦУСКЦУ"
# $SCRIPT -c ./*
mv "./а Роза упала на лапу Азора. hello, world" "./А Роза Упала На Лапу Азора. Hello, World"
mv "./ПривЕт, бездеЛЬники. Hi, dummies." "./Привет, Бездельники. Hi, Dummies."
USAGE
exit 0
}
if [ $# == 0 ]; then
usage
fi
while getopts AFhuc? opt; do
case $opt in
A) ACTION='yes';;
F) FORCE='yes';;
u) UPPER='yes';;
c) CAPS='yes';;
*) usage;;
esac
done
shift $(expr $OPTIND - 1)
if [ "$CAPS" == 'no' ]; then
if [ "$UPPER" == 'no' ]; then
sed_cmd='s/[[:upper:]]/\l&/g'
else
sed_cmd='s/[[:lower:]]/\u&/g'
fi
else
sed_cmd='s/\b\([[:alpha:]]\)\([[:alpha:]]*\)\b/\u\1\L\2\E/g'
fi
for p in "$@"; do
d=$(dirname "$p")
f=$(basename "$p")
n=$(echo "$f" | sed "$sed_cmd")
if [ "$n" == "$f" ]; then
continue
fi
if [ "$ACTION" == 'yes' ]; then
if [ -e "$d/$n" ] && [ "$FORCE" != 'yes' ]; then
echo "File '$n' exists. Use -F to overwrite"
continue
else
mv "$d/$f" "$d/$n"
fi
else
echo "mv \"$d/$f\" \"$d/$n\""
fi
done
exit 0