フォルダには*.c、*.h、およびMakefileのセットがあり、その一部にはライセンステキストが含まれており、一部にはライセンステキストが含まれていません。したがって、ファイルにライセンステキストがない場合はライセンステキストを追加し、ライセンステキストがすでに存在する場合はそれを新しいライセンステキストに置き換えることができるシェルスクリプトが必要です。
例えば
Folder1
┣━ *.c
┣━ *.h
┣━ Folder2
┃ ┣━ *.c
┃ ┣━ *.h
┃ ┣━ Makefiles
┃ ┗━ Folder4
┗━ Folder3
┣━ *.c
┣━ *.h
┗━ Makefiles
メモ:ライセンステキストは常にファイルの先頭にあります。
既存のライセンステキストの例:
# 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.
新しいライセンステキストは次のようになります。
/*---------------------------------------------------------------------
Copyright © 2014 Author Name
All rights reserved
----------------------------------------------------------------------*/
Makefileの場合は、次のようになります。
# ---------------------------------------------------------------------
# Copyright © 2014 Author Name
#
# All rights reserved
# ----------------------------------------------------------------------
答え1
バッシュを仮定すると:
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
答え2
このスクリプトは、ファイル*.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 <[email protected]>
licence text
licence text
LICENCEFILE
最初の13文字には「Copyright(C)」を含める必要があります。
上記のスクリプトによって生成されたファイルは、見つかったすべてのファイル*.new
の修正版です。スクリプトが正しい出力を生成することを確認したら、次のコマンドを使用して古いファイルを上書きします。*.c
*.h
Makefile*
for i in *.new; do mv "$i" "${i%.new}"; done