среда, 4 августа 2010 г.

Преобразовать имена файлов к нижнему регистру

Перевод статьи: Convert Filenames to Lowercase

25 июля 2008, Фил Хьюз (Phil Hughes)

Я собирался сказать, что я написал это вчера, но отметка времени файла указывает на то, что это было 22 ноября 1998. Ничего нового, ничего особенного, это просто работает.

Вернёмся в старое-доброе время операционных систем, не понимавших разницы между NAME и name. В результате, если иногда приходится копировать файлы с гибких дисков (помните такие?), созданных на Давно Онемевшей Системе, можно получить свалку каталогов с именами файлов в верхнем регистре. Поскольку мы, опытные старожилы UNIX, пользуемся хитрой уловкой для вывода имён каталогов до имён файлов файлов по команде ls (а именно - начинаем имена каталогов с букв в верхнем регистре), наличие имён файлов с символами в верхнем регистре нас раздражает.

Поскольку я слишком часто пользовался командой mv и ввод команд типа mv FILE.TXT file.txt меня окончательно изнурил, я написал этот сценарий. Я думал, что я просто сделал косметический ремонт, но на самом деле сценарий делает работу и в нём легко разобраться. (Номера строк приведены просто для того, чтобы на них ссылаться.)
1   #!/bin/sh
 2   # lowerit
 3   # преобразовывает имена всех файлов в текущем каталоге к нижнему регистру
 4   # работает только над обычными файлами -- не меняет имена каталогов
 5   # запрашивает подтверждение перед заменой существующего файла
 6   for x in `ls`
 7   do
 8     if [ ! -f $x ]; then
 9       continue
10     fi
11     lc=`echo $x | tr '[A-Z]' '[a-z]'`
12     if [ $lc != $x ]; then
13       mv -i $x $lc
14     fi
15   done
Строка 6 начинает цикл (который заканчивается в строке 15). Команда ls возвращает список имён файлов, которые последовательно назначаются переменной оболочки x. if test (строки с 8 по 10) проверяет, является ли имя текущего файла именем простого файла. Если нет, остаток выражения в текущего прохода цикла пропускается.

Если выполняется строка 11, то известно, что обрабатывается обычный файл. С помощью tr мы приводим имя файла в нижний регистр и присваиваем новое имя переменной оболочки lc. Затем в строке 12 происходит проверка, что имя файла в нижнем регистре отличается от исходного. Если это так, то выполняется 13 строка, которая меняет исходное имя файла на новое имя в нижнем регистре. Опция -i заставляет mv спрашивать подтверждение, если команда собирается перезаписать существующий файл.

Фил Хьюз (Phil Hughes)

Дополнение переводчика от 13-05-2012. Нашёл ещё один вариант скрипта для этой задачи:
$ find ./ -type f | awk '{ print $1 " " tolower($1) }' | xargs -L 1 mv

1 комментарий:

Вадим комментирует...

Не самый лучший вариант. Т.к. работает только с латинскими буквами. Плюс из-за `ls` будут серьёзные проблемы с файлами, содержащими пробелы в имени.

в общем, скрипт весьма неудачный.