Иногда возникает задача с транслитерацией имени файла в 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 и отправлять в наш скрипт.
t.tar
(3 KB)
Add new comment