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