Script de shell (bash) para adicionar ou substituir o texto de licença contido em .c, .h e makefiles?

4

Eu tenho um conjunto de * .c, * .h e Makefiles em uma pasta onde alguns arquivos contêm o texto da licença e alguns arquivos não têm nenhum texto de licença. Então, eu preciso de um script de shell onde eu possa adicionar texto de licença se o arquivo não tiver nenhum, e se o texto de licença já estiver lá, então eu quero substituí-lo pelo novo texto de licença.

Por exemplo

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

NOTA: o texto da licença estará sempre no início dos arquivos.

Exemplo de texto de licença existente:

# Copyright (C) 2008 Jack <[email protected]>

# 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.

e o novo texto de licença deve ser:

/*---------------------------------------------------------------------

Copyright © 2014  Author Name

All rights reserved

----------------------------------------------------------------------*/

e para Makefiles, deve ser:

# ---------------------------------------------------------------------
# Copyright © 2014  Author Name
#
# All rights reserved
# ----------------------------------------------------------------------
    
por Thushi 30.06.2014 / 14:04

2 respostas

4

Assumindo o bash:

function remove_copyright {
    printf "%s\n" 1,10d w q | 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
    
por 30.06.2014 / 14:54
2

Este script verifica se os arquivos *.c e *.h começam com /* Copyright (C) e Makefile* os arquivos começam com # Copyright (C) .

Nesse caso, esse script imprimirá o texto de direitos autorais especificado no seu LICENCEFILE no topo de cada arquivo como um comentário.

#!/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

Exemplo LICENCEFILE :

Copyright (C) year AuthorName  <[email protected]>
licence text
licence text

LICENCEFILE precisa conter "Copyright (C)" como os 13 primeiros caracteres.

O script acima produz arquivos *.new que são as versões modificadas de todos os arquivos *.c *.h e Makefile* encontrados. Depois de verificar se o script produziu a saída correta, basta sobrescrever os arquivos antigos com:

for i in *.new; do mv "$i" "${i%.new}"; done
    
por 30.06.2014 / 15:02