1

Я пытаюсь рекурсивно переименовать все файлы в каталоге и подкаталогах в нижний регистр, но оставляя имена каталогов без изменений.

Все найденные примеры переименовывают как файлы, так и каталоги в нижний регистр, например:

find ./ -depth -exec rename -n 'y/[A-Z]/[a-z]/' {} ";"

а также

find . -type f|while read f; do mv "$f" "$(echo $f|tr '[:upper:]' '[:lower:]')"; done

Как сохранить каталоги без изменений, но переименовать все файлы?

1 ответ1

2

Вы получаете переименование по именам каталогов, потому что команда find возвращает полный путь к именам файлов, затем команда переименования выполняет переименование также на основе имени каталога. Так что если у вас есть файл в каталоге DIR1/FILE , он будет переименован в dir1/file пока вы не хотите переименовывать каталог.

Вот команда для переименования только имени файла:

find . -type f -exec rename -n 's:([^/]*$):lc($1):e' {} +

В приведенной выше команде ([^/]*$) соответствует только последняя часть пути, которая не содержит / внутри пары круглых скобок (...) которой она сопоставляется как группа совпадений. Затем переведите соответствующую часть ($1 - индекс первой соответствующей группы) в нижний регистр с помощью функции lc() .

При этом вам нужно использовать опцию -n для переименования реальных файлов.

-exec ... {} + - для команд, которые могут принимать более одного файла одновременно (например, cat , stat , ls). Файлы, найденные командой find объединяются в цепочку, как команда xargs . Это означает, что меньшее количество разветвлений и небольших операций может означать значительное ускорение. [ ответ @Oli ]

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .