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

Profile picture for user admin_romcom

Иногда возникает задача с транслитерацией имени файла в 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

Add new comment

The content of this field is kept private and will not be shown publicly.

Plain text

  • No HTML tags allowed.
   o    o  o   o-o   o     o   o 
/ | / o | |\ /|
O--o OO | -o | | O |
o | | \ o | | | |
o-o o o o-o O---o o o

Enter the code depicted in ASCII art style.