Почему имена моих папок стали такими и как это исправить с помощью скрипта?

Остерегайтесь нескольких особых случаев, которые вам, возможно, придется здесь рассмотреть. Возьмем для примера 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, которые он оставил бы нетронутыми.

15
26.08.2019, 10:58
2 ответа

Вы можете использовать утилиту 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_*/
26
27.01.2020, 19:49

Проще всего было бы создать неправильное имя файла и правильное имя файла в той же среде, где произошел сбой, а затем просто переместить/переименовать папки с правильными именами.

Во избежание конфликтов между существующими именами лучше использовать другую папку назначения.

./saveLocationA/wrongname1 ->./saveLocationB/correctname1
./saveLocationA/wrongname2 ->./saveLocationB/correctname2
./saveLocationA/wrongname3 ->./saveLocationB/correctname3

Если возможно, я бы предпочел исправить скрипт и просто запустить его снова; исправление некоторых странных ошибок после вскрытия, вероятно, стоит дороже и может привести к новым проблемам.

Удачи!

3
27.01.2020, 19:49

Теги

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