find . -depth -name '*[A-Z]*'|sed -n 's/\(.*\/\)\(.*\)/mv -n -v -T \1\2 \1\L\2/p'|sh
Я не пробовал более сложные сценарии, упомянутые здесь, но ни одна из версий командной строки не работала для меня на моем Synology NAS. rename
нет в наличии, и многие из вариантов find
не потому , что он , кажется, прилипает к старшему имени уже переименованный путь (например, если он находит ./FOO
затем ./FOO/BAR
, не переименовывая ./FOO
к ./foo
прежнему будет продолжать список , ./FOO/BAR
даже если этот путь больше не действует) , Выше команда работала у меня без проблем.
Далее следует объяснение каждой части команды:
find . -depth -name '*[A-Z]*'
При этом будет найден любой файл из текущего каталога (перейдите .
в любой каталог, который вы хотите обработать), используя поиск в глубину (например, он будет перечислен ./foo/bar
раньше ./foo
), но только для файлов, которые содержат заглавные буквы. -name
Фильтр применяется только к базовому имени файла, а не полный путь. Так что это будет список, ./FOO/BAR
но нет ./FOO/bar
. Это нормально, так как мы не хотим переименовывать ./FOO/bar
. Мы хотим переименовать ./FOO
хотя, но это перечислено позже (вот почему -depth
важно).
Сама по себе эта команда особенно полезна для поиска файлов, которые вы хотите переименовать. Используйте эту команду после полной команды переименования для поиска файлов, которые еще не были заменены из-за конфликтов имен или ошибок.
sed -n 's/\(.*\/\)\(.*\)/mv -n -v -T \1\2 \1\L\2/p'
Эта часть читает файлы, выводимые find
и форматирует их в mv
команде с помощью регулярного выражения. -n
Опция прекращает sed
печатать вход, и p
команда в поисковых и замены регулярных выражений выходов замененного текста.
Само регулярное выражение состоит из двух захватов: части вплоть до последней / (которая является каталогом файла) и самого имени файла. Каталог оставлен без изменений, но имя файла преобразуется в нижний регистр. Так что, если find
выходы ./FOO/BAR
, то станет mv -n -v -T ./FOO/BAR ./FOO/bar
. -n
Вариант mv
убеждается существующие строчных файлы не будут перезаписаны. -v
Опция делает mv
вывод каждое изменение , что он делает (или не делает - если ./FOO/bar
уже существует, то он выдает что - то вроде ./FOO/BAR -> ./FOO/BAR
, отметив , что никаких изменений не было сделано). Здесь -T
очень важно - он рассматривает целевой файл как каталог. Это позволит убедиться, что ./FOO/BAR
он не перемещен, ./FOO/bar
если этот каталог существует.
Используйте это вместе с, find
чтобы сгенерировать список команд, которые будут выполнены (удобно, чтобы проверить, что будет сделано, фактически не делая этого)
sh
Это довольно очевидно. Он направляет все сгенерированные mv
команды в интерпретатор оболочки. Вы можете заменить его bash
или любую оболочку по своему вкусу.
ABCdef
,abcDEF
иaBcDeF
? Должен ли сценарий переименования прерваться или просто предупредить и продолжить? 2. Как вы определяете нижний регистр для не-US-ASCII имен? Если такие имена могут присутствовать, следует ли сначала выполнить проверку и исключить проход? 3. Если вы выполняете операцию переименования