Транслитерация имён файлов и папок с помощью сценария Nautilus в Linux

Русские имена файлов и папок плохо живут на серверах и в URL. Сценарий переименовывает все выделенные файлы, папки в латиницу.

Куда положить

Можно просто скачать скрипт Nautilus ниже и положить по этому пути. Скрипты Nautilus живут здесь:

bash
~/.local/share/nautilus/scripts/Транслитерация имён

В свойствах файла включаю «Исполняемый как приложение» — без этого пункта в меню не будет.

Или через командную строку

  1. Ставлю зависимости

    Нужны python3 для правил транслита и notify-send (пакет libnotify-bin) для уведомлений.

    bash
    sudo apt install -y python3 libnotify-bin
  2. Создаю файл

    Имя файла — то, что будет в меню: Транслитерация имён.

    bash
    mkdir -p ~/.local/share/nautilus/scripts
    touch ~/.local/share/nautilus/scripts/"Транслитерация имён"
  3. Даю права на исполнение

    Без прав на исполнение Nautilus скрипт не покажет.

    bash
    chmod +x ~/.local/share/nautilus/scripts/"Транслитерация имён"
  4. Открываю в редакторе

    xdg-open поднимает графический редактор, не nano.

    bash
    xdg-open ~/.local/share/nautilus/scripts/"Транслитерация имён"
  5. Вставляю код и пользуюсь

    Вставляю код ниже и пользуюсь: выделил файлы → ПКМ → «Сценарии». Чтобы меню подхватило файл:

    bash
    nautilus -q

Код

bash
#!/bin/bash

uri_to_path() {
    local s="$1"
    s="${s#file://}"
    printf '%sn' "$s" | python3 -c "
import sys, urllib.parse
for line in sys.stdin:
    line = line.strip()
    if line:
        print(urllib.parse.unquote(line))
" 2>/dev/null || echo "$s" | sed 's|%20| |g'
}

translit() {
    local s="$1"
    [ -z "$s" ] && return
    python3 -c "
import sys
s = sys.argv[1]
MAP = {
    'а':'a','б':'b','в':'v','г':'g','д':'d','е':'e','ё':'e','ж':'zh','з':'z',
    'и':'i','й':'y','к':'k','л':'l','м':'m','н':'n','о':'o','п':'p','р':'r',
    'с':'s','т':'t','у':'u','ф':'f','х':'h','ц':'ts','ч':'ch','ш':'sh','щ':'sch',
    'ъ':'','ы':'y','ь':'','э':'e','ю':'yu','я':'ya',
    'і':'i','ї':'yi','є':'ye','ґ':'g','ў':'u',
}
res = []
for c in s:
    cl = c.lower()
    if cl in MAP:
        res.append(MAP[cl])
    elif c in ' tn':
        res.append('_')
    elif c.isalnum() or c in '._-':
        res.append(c.lower())
    else:
        res.append('_')
print(''.join(res))
" "$s"
}

if [ -z "$NAUTILUS_SCRIPT_SELECTED_FILE_PATHS" ] && [ -z "$NAUTILUS_SCRIPT_SELECTED_URIS" ]; then
    notify-send "Транслитерация имён" "Ничего не выбрано. Выделите файлы или папки."
    exit 1
fi

if [ -n "$NAUTILUS_SCRIPT_SELECTED_FILE_PATHS" ]; then
    RAW_PATHS="$NAUTILUS_SCRIPT_SELECTED_FILE_PATHS"
else
    RAW_PATHS=$(echo "$NAUTILUS_SCRIPT_SELECTED_URIS" | while IFS= read -r uri; do uri_to_path "$uri"; done)
fi
PATHS=$(echo "$RAW_PATHS" | tr -d 'r' | sed 's/[[:blank:]]*$//' | grep -v '^$')

MADE=0
ERR=""

while IFS= read -r path; do
    path="${path%%$'n'*}"
    [ -z "$path" ] && continue
    [[ "$path" == file://* ]] && path=$(uri_to_path "$path") && path="${path%%$'n'*}"
    [ ! -e "$path" ] && continue

    parent=$(dirname "$path")
    name=$(basename "$path")

    # Расширение оставляем как есть (транслитерируем только имя до последней точки для файлов)
    if [ -f "$path" ] && [[ "$name" == *.* ]]; then
        base="${name%.*}"
        ext=".${name##*.}"
    else
        base="$name"
        ext=""
    fi

    newbase=$(translit "$base")
    [ -z "$newbase" ] && newbase="file"
    newname="${newbase}${ext}"
    newpath="$parent/$newname"

    if [ "$newname" = "$name" ]; then
        continue
    fi
    if [ -e "$newpath" ] && [ "$newpath" != "$path" ]; then
        ERR="${ERR}${name} → уже существует: ${newname}"$'n'
        continue
    fi

    if mv -- "$path" "$newpath" 2>/dev/null; then
        MADE=$((MADE + 1))
    else
        errmsg=$(mv -- "$path" "$newpath" 2>&1)
        ERR="${ERR}${name}: ${errmsg}"$'n'
    fi
done <<< "$PATHS"

if [ -n "$ERR" ]; then
    notify-send "Транслитерация имён" "Переименовано: $MADE."$'n'"Ошибки:"$'n'"$ERR"
elif [ "$MADE" -gt 0 ]; then
    notify-send "Транслитерация имён" "Переименовано: $MADE."
fi
← К списку статей

Поделиться

Комментарии

Пока нет комментариев — можете написать первый.

Оставить комментарий

Войти с помощью

или оставьте комментарий как гость

Отправка защищена сервисом Yandex SmartCaptcha. Подробности — в политике конфиденциальности.