Только рекурсивные файлы переименования в Linux

1049
Don Smythe

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

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

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
В чем проблема со вторым? `-type f` перечисляет только обычные файлы. Каталоги не попадают в список. 9 лет назад 0
Вы также можете добавить `-type f` к первой команде` find`, что для меня выглядит самым простым, понятным и простым для запоминания способом сделать это. The Peach 9 лет назад 1

1 ответ на вопрос

2
αғsнιη

Вы получаете переименование по именам каталогов, потому что 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 ]

Это все еще переименовывает последний каталог в дереве, поскольку это итерирует все же. Но может быть исправлено, если изменить на: найти. -name "* .type" -exec переименовать s: ([^ /] * $): lc ($ 1): e '{} + 9 лет назад 0
@ DonSmythe Ну, правильно, я пропустил `-типа f`. исправил это. благодарю вас. αғsнιη 9 лет назад 0

Похожие вопросы