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