Обратите внимание, что вы используете скрипт Perl, называемыйrename
распространяемым Debian и производными (Ubuntu, Mint,…). Другие дистрибутивы Linux поставляют совершенно другую и значительно менее полезную команду rename
.
y/A-Z/a-z/
переводит каждый символ в диапазоне A
через Z
в соответствующий символ в диапазоне a
через z
, т.е. ASCII прописных букв в соответствующей строчной буквы. Для выполнения обратного перевода используйте y/a-z/A-Z/
. Другой способ написать ту же команду , которая rename '$_ = uc($_)' *
- uc
это у PPER с функцией азы, а rename
команда переименовывает файлы , основанная на преобразовании из к $_
переменному.
rename '…' *
переименовывает только файлы в текущем каталоге, потому что это то, что *
соответствует. Точечные файлы (файлы, с которых начинается название .
) тоже пропускаются.
Если вы хотите рекурсивно переименовывать файлы в текущем каталоге и в подкаталогах, вы можете использовать find
команду для рекурсивного обхода текущего каталога. Здесь возникает трудность: если вы позвоните rename
, это переименует и каталог, и часть базового имени. Если вы rename
обращаетесь к каталогу, прежде чем возвращаться в него ( find -exec rename … {} \;
), он find
запутывается, потому что он нашел каталог, но этот каталог больше не существует, когда он пытается спуститься в него. Вы можете обойти это, попросив find
пройти по каталогу, прежде чем действовать, но затем вы попытаетесь переименовать foo/bar
его, FOO/BAR
но каталог FOO
не существует.
Простой способ избежать этой трудности - заставить команду переименования действовать только на часть базового имени пути. Регулярное выражение ([^/]*\Z)
соответствует последней части пути, которая не содержит /
.
find . -depth -exec rename 's!([^/]*\Z)!uc($1)!e' {} +
Оболочка zsh предоставляет более удобные функции для переименования - даже более загадочно, чем Perl, но более краткая и часто более простая для составления.
Функция zmv
переименовывает файлы на основе шаблонов. Запустите autoload -U zmv
один раз, чтобы активировать его (поместите эту строку в свой .zshrc
).
В первом аргументе zmv
(шаблон для замены) вы можете использовать мощные шаблоны шаблонов zsh . Во втором аргументе zmv
(текст замены) вы можете использовать функции расширения его параметров , включая модификаторы истории .
zmv -w '**/*' '$1$2:u'
Объяснение:
-w
- автоматическое присвоение числовых переменных каждому шаблону подстановки
**/*
- все файлы в подкаталогах, рекурсивно ( **/
соответствует 0, 1 или более уровням подкаталогов)
$1
- первая числовая переменная, здесь совпадающая с частью каталога каждого пути
$2:u
- вторая числовая переменная, здесь совпадающая с частью базового имени каждого пути, с :u
модификатором для преобразования значения в верхний регистр
В качестве дополнительного бонуса это учитывает настройки окружающего языка.
Если вы не уверены в zmv
написанной вами команде, вы можете передать -n
опцию, чтобы напечатать, что будет делать команда, и ничего не менять. Проверьте вывод и, если он делает то, что вы хотите, повторно запустите команду без -n
фактического действия.
rename 'y/a-z/A-Z/' *
вы получите то, что вы хотите. Тщательно, когда вы проверяете это до конца.