Сценарий оболочки (bash) для добавления или замены текста лицензии, содержащегося в файлах .c, .h и makefiles?

У меня есть набор * .c, * .h и Makefiles в папке, где некоторые файлы содержат текст лицензии, а некоторые файлы не имеют никакого текста лицензии. Поэтому мне нужен сценарий оболочки, где я могу добавить текст лицензии, если файл не имеет, и если текст лицензии уже существует, я хочу заменить его новым текстом лицензии.

Например

Folder1 ┣━ *.c ┣━ *.h ┣━ Folder2 ┃ ┣━ *.c ┃ ┣━ *.h ┃ ┣━ Makefiles ┃ ┗━ Folder4 ┗━ Folder3 ┣━ *.c ┣━ *.h ┗━ Makefiles 

ПРИМЕЧАНИЕ. Текст лицензии всегда будет в начале файлов.

Пример существующего текста лицензии:

 # Copyright (C) 2008 Jack <abc@cba.com> # This file is free software; as a special exception the author gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. 

и новый текст лицензии должен быть:

 /*--------------------------------------------------------------------- Copyright © 2014 Author Name All rights reserved ----------------------------------------------------------------------*/ 

и для Make-файлов это должно быть:

 # --------------------------------------------------------------------- # Copyright © 2014 Author Name # # All rights reserved # ---------------------------------------------------------------------- 

  • разбивать файл на несколько частей
  • Зеркалирование stackexchange, включая внешние изображения
  • Возьмите grep значение и выведите количество и значение вместе
  • Как преобразовать беззнаковое десятичное число (менее 1 << 32) в 4 байта (двоичное) в bash?
  • Shell Script для изоляции файлов, разбросанных по разным папкам
  • Запустить скрипт на / dev / tty-доступ
  • Как передать несколько строк параметру без цикла for?
  • Значение параметра не устраняется
  • 2 Solutions collect form web for “Сценарий оболочки (bash) для добавления или замены текста лицензии, содержащегося в файлах .c, .h и makefiles?”

    Предполагая, что bash:

     function remove_copyright { printf "%s\n" 1,10d wq | ed "$1" } function add_copyright { if [[ $1 == Makefile ]]; then ed "$1" <<END 0i # --------------------------------------------------------------------- # Copyright © 2014 Author Name # # All rights reserved # --------------------------------------------------------------------- . w q END else ed "$1" <<END 0i /*--------------------------------------------------------------------- Copyright © 2014 Author Name All rights reserved ---------------------------------------------------------------------*/ . w q END fi } shopt -s nullglob globstar for file in **/*.[ch]; do if grep -q '^# Copyright \(C\)' "$file"; then remove_copyright "$file" fi add_copyright "$file" done 

    Этот скрипт проверяет, если файлы *.c и *.h начинаются с /* Copyright (C) и файлов Makefile* начинаются с # Copyright (C) .

    Если это так, этот скрипт напечатает текст авторского права, указанный в вашем LICENCEFILE поверх каждого файла в качестве комментария.

     #!/bin/bash LICENCEFILE="licence" [ ! -f "$LICENCEFILE" ] && echo "$LICENCEFILE is missing. Abort." && exit 1 for i in *.c *.h; do [ "$(head -c16 $i)" == "/* Copyright (C)" ] && continue NEWFILE="${i}.new" [ -f "$NEWFILE" ] && echo "Sorry, $NEWFILE already exists" && continue echo "/* " > "$NEWFILE" cat "$LICENCEFILE" >> "$NEWFILE" echo "*/" >> "$NEWFILE" cat "$i" >> "$NEWFILE" done for i in Makefile*; do [ "$(head -c15 $i)" == "# Copyright (C)" ] && continue NEWFILE="${i}.new" [ "${i#*.}" == "new" ] && continue [ -f "$NEWFILE" ] && echo "Sorry, $NEWFILE already exists" && continue while read line; do echo "# $line" >> "$NEWFILE" done < "$LICENCEFILE" cat "$i" >> "$NEWFILE" done 

    Пример LICENCEFILE :

     Copyright (C) year AuthorName <author@id.com> licence text licence text 

    LICENCEFILE должен содержать «Copyright (C)» в качестве первых 13 символов.

    Вышеупомянутый скрипт создает *.new файлы, которые являются модифицированными версиями всех найденных файлов *.c *.h и Makefile* . После того, как вы подтвердили, что сценарий создал правильный вывод, просто перезапишите старые файлы:

     for i in *.new; do mv "$i" "${i%.new}"; done 
    Linux и Unix - лучшая ОС в мире.