
Я пытаюсь переименовать несколько файлов с помощью «rename», и у меня есть правильно настроенное регулярное выражение:
rename --verbose --path 's|^\[(....)\](.*)\.(.*)|$2 ($1).$3|' *
Но мне бы очень хотелось, чтобы каждый файл был помещен в каталог с общим началом, поэтому я попробовал:
rename --verbose --path 's|^\[(....)\](.*)\.(.*)|$2 ($1)/$2 ($1).$3|' *
Но это жалуется, что ни один из каталогов не существует (так как их нет). Я упускаю полезный флаг для переименования или это лучший инструмент для этого?
решение1
Если вы используете Perl-ориентированный метод rename
, то ничто не мешает вам вызвать mkdir()
для создания недостающих каталогов:
rename --verbose '
s|^\[(....)\](.*)\.(.*)|$2 ($1)/$2 ($1).$3| &&
mkdir("$2 ($1)")' *
Это то же выражение Perl, которое вы используете, с добавленным вызовом mkdir()
в конце для создания каталога, если выражение совпадает.
Является ли исходная подстановка правильной или нет, и имеет ли она смысл, я не знаю (я не знаю, какие типы имен файлов у вас есть). Дело в том, что поскольку выражение является общим выражением Perl, вы можете использовать любой код Perl, пока $_
(переменная по умолчанию) установлена на результирующее имя файла в конце.