Іноді виникає завдання з транслітерацією імені файлу на 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 і надсилатиме в наш скрипт.

Коментувати

Вміст цього поля є приватним і не буде доступний широкому загалу.
  • Не дозволено жодних HTML теґів.