Вы должны делать это по одному уровню каталога за раз, потому что базовый системный вызов rename
может вносить только одно изменение за раз.
Инструмент для достижения - это утилита rename
, которая поставляется с Perl; Я не могу найти его документацию в Интернете, или я бы дал ссылку на него. Если набрать man rename
в командной строке, появится что-то вроде этого:
NAME
rename - renames multiple files
SYNOPSIS
rename [ -v ] [ -n ] [ -f ] perlexpr [ files ]
тогда у вас есть правильная вещь. К сожалению, есть по крайней мере еще одна утилита с таким же именем, которая более или менее бесполезна для этой работы, и единственный способ определить, что у вас есть, - это попробовать.
Поскольку вы знаете, что у вас есть четыре уровня каталогов с односимвольными именами, вы можете просто перечислить уровни каталогов, например:
rename 'y/a-z/A-Z/ if -d $_' ?
rename 'y/a-z/A-Z/ if -d $_' ?/?
rename 'y/a-z/A-Z/ if -d $_' ?/?/?
rename 'y/a-z/A-Z/ if -d $_' ?/?/?/?
Если бы могло быть произвольное вложение, вы должны были бы быть умнее.