Использование команды переименования чтобы переименовать первую часть файла

Хотя это непосредственно не отвечает на вопрос, вот связанный сценарий, который я записал для обнаружения файлов, которые не заканчиваются в новой строке. Это очень быстро.

find . -type f | # sort |        # sort file names if you like
/usr/bin/perl -lne '
   open FH, "<", $_ or do { print " error: $_"; next };
   $pos = sysseek FH, 0, 2;                     # seek to EOF
   if (!defined $pos)     { print " error: $_"; next }
   if ($pos == 0)         { print " empty: $_"; next }
   $pos = sysseek FH, -1, 1;                    # seek to last char
   if (!defined $pos)     { print " error: $_"; next }
   $cnt = sysread FH, $c, 1;
   if (!$cnt)             { print " error: $_"; next }
   if ($c eq "\n")        { print "   EOL: $_"; next }
   else                   { print "no EOL: $_"; next }
'

Сценарий жемчуга читает список (дополнительно отсортированный) имена файлов от stdin, и для каждого файла он читает последний байт, чтобы определить, заканчивается ли файл в новой строке или нет. Это очень быстро, потому что это старается не читать все содержание каждого файла. Это производит одну строку для каждого файла, который это читает, снабженный префиксом "ошибку": если некоторая ошибка происходит, "пустая": если файл пуст (не заканчивается новой строкой!), "EOL": ("конец строки"), если файл заканчивается новой строкой и "никаким EOL": если файл не заканчивается новой строкой.

Примечание: сценарий не обрабатывает имена файлов, которые содержат новые строки. Если Вы находитесь на GNU или системе BSD, Вы могли бы обработать все возможные имена файлов путем добавления-print0 для нахождения,-z к виду, и-0 к жемчугу, как это:

find . -type f -print0 | sort -z |
/usr/bin/perl -ln0e '
   open FH, "<", $_ or do { print " error: $_"; next };
   $pos = sysseek FH, 0, 2;                     # seek to EOF
   if (!defined $pos)     { print " error: $_"; next }
   if ($pos == 0)         { print " empty: $_"; next }
   $pos = sysseek FH, -1, 1;                    # seek to last char
   if (!defined $pos)     { print " error: $_"; next }
   $cnt = sysread FH, $c, 1;
   if (!$cnt)             { print " error: $_"; next }
   if ($c eq "\n")        { print "   EOL: $_"; next }
   else                   { print "no EOL: $_"; next }
'

Конечно, необходимо было бы все еще придумать способ закодировать имена файлов новыми строками в выводе (оставленный как осуществление для читателя).

Вывод мог быть фильтрован при желании для добавления новой строки в те файлы, которые не имеют один, наиболее просто с

 echo >> "$filename"

Отсутствие заключительной новой строки может вызвать ошибки в сценариях начиная с некоторых версий оболочки, и другие утилиты правильно не обработают недостающую заключительную новую строку при чтении такого файла.

По моему опыту, отсутствие заключительной новой строки заставлено при помощи различных утилит Windows отредактировать файлы. Я никогда не видел, что энергия вызывает недостающую заключительную новую строку при редактировании файла, хотя она сообщит относительно таких файлов.

Наконец, там намного короче (но медленнее) сценарии, которые могут циклично выполниться по их исходным данным имени файла для печати тех файлов, которые не заканчиваются в новой строке, такой как:

/usr/bin/perl -ne 'print "$ARGV\n" if /.\z/' -- FILE1 FILE2 ...
2
06.10.2015, 16:16
1 ответ
  1. это переименование заменит INIT_ в качестве конечной части имени файла. (foo.INIT_ будет переименован в foo.FINAL_, по REGEXP парадигме '$' является концом строки '^' началом и т.д. ... )
  2. \I приводит к неизвестному переключателю для переименования

попробуйте

 rename -n s/INIT_/FINAL_/ $(find . -print )

для предварительного просмотра.
где

  • -n флаг для предварительного просмотра
  • $(find . -print ) пойдет вниз по каталогу (от локального dir), LHS(*) rename будет фильтровать имя.

    rename s/INIT_/FINAL_/ $(find . -print )

кавычки не нужны, если нет смешного имени.

(*) означает "левая сторона".

5
27.01.2020, 21:56

Теги

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