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. Если вы выполняете операцию переименования