Игорь Пашев - Программа для изменения регистра имён файлов

Jan. 10th, 2010

02:46 pm - Программа для изменения регистра имён файлов

Previous Entry Add to Memories Tell A Friend Next Entry

Может делать имена большими буквам, маленькими буквами, большими первыми буквами каждого слова.

Требует 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

Tags: ,
(Оставить комментарий)