Команда печати Bash с номером

Вы можете использовать утилиту 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_*/
0
09.10.2021, 16:29
0 ответов

Теги

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