Остерегайтесь нескольких особых случаев, которые вам, возможно, придется здесь рассмотреть. Возьмем для примера 4 файла:
file1
пустой файл file2
файл с одной новой строкой ( )символ (одна пустая строка)file3
правильный текстовый файл, например:
foo
bar
file4
файл с последней строкой без разделителя -:
foo
bar
Если хочешь:
file1
:пустойfile2
:\n
file3
:foo\nbar\n
file4
:foo\nbar
(, например, чтобы вы могли восстановить файл, передав вывод вprintf %b
).
Тогда можно:
perl -pe 's/\n/\\n/; END{print "\n" if $.}' < file
Или с GNUawk
:
gawk '{printf "%s", $0 (RT ? "\\n" : "")}
END{if (NR) print ""}' < file
Вы можете адаптироваться, если хотите игнорировать разделитель последней строки, если он есть, или не хотите завершающую новую строку, но тогда вы можете проверить эти 4 разных случая, когда он делает то, что вы хотите, как вы' Вероятно, вы обнаружите, что для некоторых из них вам необходимо специальное лечение.
Например, ваш
< file sed '$!G' | paste -sd '\\n' -
решение игнорировать разделитель последней строки дает одну пустую строку как для file1
, так и для file2
(, а также для -неправильно разделенного текста -(file4
)может работать неправильно со всеми sed
/ paste
реализации предназначены для работы с действительным текстом ).
perl -pe 's/\n?$/eof ? "\n" : "\\n"/e' < file
может быть более портативным и, возможно, немного лучше для file1
и file2
, которые он оставил бы нетронутыми.
Вы можете использовать утилиту 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_*/
Проще всего было бы создать неправильное имя файла и правильное имя файла в той же среде, где произошел сбой, а затем просто переместить/переименовать папки с правильными именами.
Во избежание конфликтов между существующими именами лучше использовать другую папку назначения.
./saveLocationA/wrongname1 ->./saveLocationB/correctname1
./saveLocationA/wrongname2 ->./saveLocationB/correctname2
./saveLocationA/wrongname3 ->./saveLocationB/correctname3
Если возможно, я бы предпочел исправить скрипт и просто запустить его снова; исправление некоторых странных ошибок после вскрытия, вероятно, стоит дороже и может привести к новым проблемам.
Удачи!