Русские имена файлов и папок плохо живут на серверах и в URL. Сценарий переименовывает все выделенные файлы, папки в латиницу.
Куда положить
Можно просто скачать скрипт Nautilus ниже и положить по этому пути. Скрипты Nautilus живут здесь:
~/.local/share/nautilus/scripts/Транслитерация имён
В свойствах файла включаю «Исполняемый как приложение» — без этого пункта в меню не будет.
Или через командную строку
- Ставлю зависимости
Нужны python3 для правил транслита и notify-send (пакет libnotify-bin) для уведомлений.
sudo apt install -y python3 libnotify-bin - Создаю файл
Имя файла — то, что будет в меню: Транслитерация имён.
mkdir -p ~/.local/share/nautilus/scripts touch ~/.local/share/nautilus/scripts/"Транслитерация имён" - Даю права на исполнение
Без прав на исполнение Nautilus скрипт не покажет.
chmod +x ~/.local/share/nautilus/scripts/"Транслитерация имён" - Открываю в редакторе
xdg-open поднимает графический редактор, не nano.
xdg-open ~/.local/share/nautilus/scripts/"Транслитерация имён" - Вставляю код и пользуюсь
Вставляю код ниже и пользуюсь: выделил файлы → ПКМ → «Сценарии». Чтобы меню подхватило файл:
nautilus -q
Код
#!/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
Комментарии
Пока нет комментариев — можете написать первый.