Вы можете использовать утилиту perl rename
(, также известную как prename
или file-rename
), для переименования каталогов.
ПРИМЕЧАНИЕ.:Не следует путать с rename
из util-linux
или с любой другой версией.
rename -n 's/([[:cntrl:]])/ord($1)/eg' run_*/
Здесь используется функция Perl ord()
для замены каждого управляющего символа -в имени файла порядковым номером этого символа. например, ^A
становится 1, ^B
становится 2 и т. д.
Опция -n
предназначена для пробного -прогона, чтобы показать, чтоrename
сделает , если вы позволите. Удалите его (или замените его на -v
для подробного вывода )для фактического переименования.
Модификатор e
в операции s/LHS/RHS/eg
заставляет perl выполнять RHS (замену )как код perl, а $1
— это совпадающие данные (управляющий символ )из ЛХС.
Если вы хотите, чтобы в именах файлов не было -дополненных цифр, вы можете комбинировать ord()
с sprintf()
. например.
$ rename -n 's/([[:cntrl:]])/sprintf("%02i",ord($1))/eg' run_*/ | sed -n l
rename(run_\001, run_01)$
rename(run_\002, run_02)$
rename(run_\003, run_03)$
rename(run_\004, run_04)$
rename(run_\005, run_05)$
rename(run_\006, run_06)$
rename(run_\a, run_07)$
rename(run_\b, run_08)$
rename(run_\t, run_09)$
Приведенные выше примеры работают тогда и только тогда, когдаsp.run_number
в вашем сценарии Matlab находится в диапазоне 0..26 (, поэтому он создает управляющие символы -в именах каталогов ).
Чтобы иметь дело с ЛЮБЫМ 1 -байтовым символом (, то есть от 0 до 255 ), вы должны использовать:
rename -n 's/run_(.)/sprintf("run_%03i",ord($1))/e' run_*/
Если бы sp.run_number
могло быть > 255, вам пришлось бы использовать функцию Perl unpack()
вместо ord()
. Я точно не знаю, как Matlab выводит непреобразованный int в строку, так что вам придется поэкспериментировать. Подробности см. в perldoc -f unpack
.
напр. следующее распаковывает как 8 -бит, так и 16 -бит без знака, и ноль -дополняет их до 5 цифр:
rename -n 's/run_(.*)/sprintf("run_%05i",unpack("SC",$1))/e' run_*/