Только рекурсивные файлы переименования в Linux
Я пытаюсь рекурсивно переименовать все файлы в каталоге и подкаталогах в нижний регистр, но оставляя имена каталогов без изменений.
Все найденные примеры переименовывают как файлы, так и каталоги в нижний регистр, например:
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 ответ
Вы получаете переименование на имена каталогов, потому что 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]