LINUX.ORG.RU

[bash] Наконец-то вменяемая программа для изменения регистра

 


0

0

Р-р-рекомендованное название --- recase.

#!/bin/bash

set -e
set -u


ACTION='no'
FORCE='no'
UPPER='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.

Options are:
    -A        Do actual work ($ACTION)
    -F        Force renaming if files exist ($FORCE)
    -u        Rename to upper case instead of lower ($UPPER)

    -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/УМЦУУКЦУСКЦУ"

USAGE
    exit 0
}

if [ $# == 0 ]; then
    usage
fi

while getopts AFhu? opt; do
    case $opt in
        A) ACTION='yes';;
        F) FORCE='yes';;
        u) UPPER='yes';;
        *) usage;;
    esac
done
shift $(expr  $OPTIND - 1)

if [ "$UPPER" == 'no' ]; then
    sed_cmd='s/[[:upper:]]/\l&/g'
else
    sed_cmd='s/[[:lower:]]/\u&/g'
fi

for p in "$@"; do
    
    d=$(dirname  "$p")
    f=$(basename "$p")

    n=$(echo "$f" | sed "$sed_cmd")

    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

☆☆

Ответ на: комментарий от ShTH

ShTH wrote:

Зачем оно нужно?

Типа конвертация регистра имён файлов.

GotF ★★★★★
()

Молодец.

Я, вроде, видел вариант через tr когда A-Z заменялся на a-z. Вроде, тоже несложно. Я бы ещё добавил опцию рекурсивного обхода директории через find чтобы можно было всю папки прибить.

Правда, мне не очень понятно зачем это нужно.

true_admin ★★★★★
()
Ответ на: комментарий от true_admin

Предложенный вариант работает с Юникодом, а «a-z» --- нет.

Рекурсия делается не вложением, а обёрткой find:

find -type f -iname '*.jpg' -exec recase -A {} \;
ip1981 ☆☆
() автор топика
Ответ на: комментарий от true_admin

К тому же ошибки могут быть катастрофичны, поэтому не надо лишней автоматики. Этот скрипт по умолчанию лишь показывает, что он будет делать, но не делает.

ip1981 ☆☆
() автор топика
Ответ на: комментарий от ip1981

>>tr a-z на на A-Z

Предложенный вариант работает с Юникодом, а «a-z» --- нет.


Неужели все так плохо с coreutils?

anonymous
()
Ответ на: комментарий от xetf

Первые буквы? Попробую. Завтра.

Сейчас собираю Compiz 0.8.4 со всеми погремушками и смотрю «Секунды до катастрофы» :-)

ip1981 ☆☆
() автор топика

Скриптик-то прикольный, но слишком узкоспециализированный.
Такое, как правило, в одну строчку записывается при надобности.

Deleted
()
Ответ на: комментарий от ip1981

Ещё и русские имена файлов... Ты файлопомойку от юзеров чтоли разгребаешь?

Я своим сказал почти пять лет назад что работать будут только файлы названные по английски, название файла должно отражать его содержимое и быть уникальным(а то закачки глючат, там самописная файлопомойка). Прошли годы, всего три раза были проблемы потому что имя файлу дали не уникальное :).

true_admin ★★★★★
()

А convmv не работает разве с русским языком?

PartyZan ★★★
()

Я-то думал, Keyboard Ninja наконец-то допилили до поддержки многопроцессорности

Karapuz ★★★★★
()
Ответ на: комментарий от ip1981
#!/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

ip1981 ☆☆
() автор топика

полезная штука, спасибо.
Ещё ищу скрипт для превращения unicode в созвучный ascii (хотя бы для русских букв).
Например «Имя файла» => «Imya_faila»

Dblmok
()
Ответ на: комментарий от Dblmok

Ну, и это несложно.

Типа

sed 's/п/p/g; s/К/k/g'

Я такое делал, но для ТеХа:

#!/bin/bash

sed 's/А/{\\CYRA }/g
    s/Б/{\\CYRB }/g
    s/В/{\\CYRV }/g
    s/Г/{\\CYRG }/g
    s/Д/{\\CYRD }/g
    s/Е/{\\CYRE }/g
    s/Ё/{\\CYRYO }/g
    s/Ж/{\\CYRZH }/g
    s/З/{\\CYRZ }/g
    s/И/{\\CYRI }/g
    s/Й/{\\CYRISHRT }/g
    s/К/{\\CYRK }/g
    s/Л/{\\CYRL }/g
    s/М/{\\CYRM }/g
    s/Н/{\\CYRN }/g
    s/О/{\\CYRO }/g
    s/П/{\\CYRP }/g
    s/Р/{\\CYRR }/g
    s/С/{\\CYRS }/g
    s/Т/{\\CYRT }/g
    s/У/{\\CYRU }/g
    s/Ф/{\\CYRF }/g
    s/Х/{\\CYRH }/g
    s/Ц/{\\CYRC }/g
    s/Ч/{\\CYRCH }/g
    s/Ш/{\\CYRSH }/g
    s/Щ/{\\CYRSHCH }/g
    s/Ъ/{\\CYRHRDSN }/g
    s/Ы/{\\CYRERY }/g
    s/Ь/{\\CYRSFTSN }/g
    s/Э/{\\CYREREV }/g
    s/Ю/{\\CYRYU }/g
    s/Я/{\\CYRYA }/g
    s/а/{\\cyra }/g
    s/б/{\\cyrb }/g
    s/в/{\\cyrv }/g
    s/г/{\\cyrg }/g
    s/д/{\\cyrd }/g
    s/е/{\\cyre }/g
    s/ё/{\\cyryo }/g
    s/ж/{\\cyrzh }/g
    s/з/{\\cyrz }/g
    s/и/{\\cyri }/g
    s/й/{\\cyrishrt }/g
    s/к/{\\cyrk }/g
    s/л/{\\cyrl }/g
    s/м/{\\cyrm }/g
    s/н/{\\cyrn }/g
    s/о/{\\cyro }/g
    s/п/{\\cyrp }/g
    s/р/{\\cyrr }/g
    s/с/{\\cyrs }/g
    s/т/{\\cyrt }/g
    s/у/{\\cyru }/g
    s/ф/{\\cyrf }/g
    s/х/{\\cyrh }/g
    s/ц/{\\cyrc }/g
    s/ч/{\\cyrch }/g
    s/ш/{\\cyrsh }/g
    s/щ/{\\cyrshch }/g
    s/ъ/{\\cyrhrdsn }/g
    s/ы/{\\cyrery }/g
    s/ь/{\\cyrsftsn }/g
    s/э/{\\cyrerev }/g
    s/ю/{\\cyryu }/g
    s/я/{\\cyrya }/g'

ip1981 ☆☆
() автор топика
Ответ на: комментарий от ip1981

P. S. Лень пробовать, но, наверно, можно так:

#!/usr/bin/sed
s/А/{\\CYRA }/g 
s/Б/{\\CYRB }/g 
s/В/{\\CYRV }/g 
s/Г/{\\CYRG }/g 
s/Д/{\\CYRD }/g 
s/Е/{\\CYRE }/g 
s/Ё/{\\CYRYO }/g 
...

ip1981 ☆☆
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.