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

Иногда возникает задача с транслитерацией имени файла в Linux. Вручную делать лень, особенно когда файлов больше чем один. Устаналивать дополнительные программы, которые делают такую ерундовую задачу тоже нет особого желания. Данный скрипт автоматизирует эту работу. Для универсальности, можно закинуть скрипт в /usr/local/bin и использовать его везде.

Создайте файл с именем t.sh

#!/bin/sh

# Rename utility.

if [ "$1" = "-h" ] || [ "$1" = "--help" ]; then
    echo "usage: $(basename $0) FILE [...]"
    echo
    exit 0
fi
IFS=$'
    '
for f in "$@"
do
    if [ ! -f "$f" ]; then
        echo "$(basename $0) warn: this is not a regular file (skipped): $f" >&2
        continue
    fi

    NEWFILENAME="$(basename "$f")"
    NEWFILENAME="$( echo -n "$NEWFILENAME" | { uconv -x 'Any-Latin;Latin-ASCII' || cat ; } )" # convert non-latin chars using uconv from the icu-devtools package
    NEWFILENAME="$( echo -n "$NEWFILENAME" | iconv -f UTF-8 -t ascii//TRANSLIT//IGNORE )"
    NEWFILENAME="$( echo -n "$NEWFILENAME" | sed -e 's/[+]/_plus_/g' \
        |tr -c '[A-Za-z0-9._\-]' '_' \
        | tr '\[\]' '_' \
        | sed -e 's/__*/_/g' \
        | sed -e 's/_\././g' )"

    if [ -f "$(basename $f)/$NEWFILENAME" ]; then
        echo "$(basename $0) warn: target filename already exists (skipped): $(basename $f)/$NEWFILENAME" >&2
        continue
    fi
    if [ "$(basename $f)" != "$NEWFILENAME" ]; then
        echo "\`$f' -> \`$NEWFILENAME'"
        mv -i "$f" "$NEWFILENAME"
    fi
done

Запускать в консоли

$ ./t.sh FILENAME

Для того чтоб транслитерировать множество файлов в директории можно задать так:

$ find . -iname "*.jpg" -exec ./t.sh {} \;

Данная команда будет искать файлы с расширением jpg и отправлять в наш скрипт.

Download: 
Tags: 

Комментарии

Добавить комментарий