forループを使用して、プロジェクトディレクトリ内のすべてのヘッダーファイルとソースファイルにライセンスヘッダーを追加しようとしています。これは機能していませんが、他のアプローチを使用していsed
ますか?
forループを使用して、プロジェクトディレクトリ内のすべてのヘッダーファイルとソースファイルにライセンスヘッダーを追加しようとしています。これは機能していませんが、他のアプローチを使用していsed
ますか?
回答:
これは多かれ少なかれ、ダニエル・セロディオの答えに対する単なる拡張解説です。コメントとして書き始めましたが、すぐに大きくなりすぎました...
bash globを再帰的にするには、が必要shopt -s globstar
です。globstarを有効にする必要があります。有効に**
しないと機能しません。globstar shellオプションは、bashのバージョン4に導入されました。
などのディレクトリの処理を回避my.cpp/
するには、test [[ -f $f ]]
...を使用します。テストが二重角括弧で囲まれている場合、変数を二重引用符で囲む必要はありません。
またshopt -s nullglob
、を使用することにより、一致するファイルがない可能性を考慮することができます。これにより、ファイルに一致しないパターンを、それ自体ではなくヌル文字列に展開できます。
複数のパターンを処理するには、globパターンを連鎖させることができます。**/*.cpp **/*.h
ただし、おそらくシェルオプションextglobがviaでオンになっているshopt -s extglob
場合は**/*.@(cpp|h)
、ファイルシステムの複数のパスを回避するような構造を使用できます。パターンごとに1回。
.files
含めたい場合、使用する場合.*.cpp
、または使用する場合shopt -s dotglob
パイプされているファイルの変更を安全に処理するには、sponge
fromパッケージを使用しますmoreutils
(独自の一時ファイルを作成する必要がなくなります)
printf "// The License\n\n" > /tmp/$USER-license
shopt -s globstar nullglob extglob
for f in **/*.@(cpp|h) ;do
[[ -f $f ]] && cat "/tmp/$USER-license" "$f" | sponge "$f"
done
[[
、nullを適切に処理できます$f
。
unset x; [ -f $x ] && echo exists
の報告書は、「存在」...(固定)
**/*.@(cpp|h)
と$( find . -name "*.h" -name "*.cpp")
ありがとう、@ fred、@ maxmackie、@ enzotib。
私が従った手順を確認してください。
#!/bin/sh
# script to copy the headers to all the source files and header files
for f in *.cpp; do
if (grep Copyright $f);then
echo "No need to copy the License Header to $f"
else
cat license.txt $f > $f.new
mv $f.new $f
echo "License Header copied to $f"
fi
done
それ以外の場合、ライセンスヘッダーは複数回コピーされます。
プロジェクトディレクトリとサブディレクトリのすべてのヘッダーとソースを調べるパターンを提案してください。
@fredが示唆したことを完全に理解できませんでした。
targln=2; findln=$(sed -rne $targln'{\|// Copyright|=;q}' "$f"); if ((findln==targln));then
...しかし、もちろん、他のすべてのものを超えて、最初に徹底的にテストしてください... PS。UnixおよびLinuxのコースでは、答えとしてではなく、元の質問にそのような追加を投稿するのが
grep
、に-q
オプションを追加しますgrep
。常に二重引用符を追加します$f
。
ex
またはed
、必要に応じてこれを行うことができます(sed
要求どおりにこれを行うべきではありません。sed
ストリームを編集するように設計されている-i
ため、さまざまな理由で悪い考えです)。
shopt -s globstar
for _file in **/*.@(cpp|h); do
ed -s "${_file}" << EOF
0a
/* This file is licensed under the foo license.
All copyright strictly enforced by the copyright monster. */
.
w
EOF
done
sed -i
悪い考えですか?
sed -i
は、シンボリックリンクとハードリンクが解除され、予期しない動作が発生します。せいぜい直感的ではなく、さらに悪いことに積極的に有害です。
#!/bin/bash
for i in `find . -name '*.[m|h]'` # or whatever other pattern...
do
echo $i
if ! grep -q Copyright $i
then
cat copyright.txt $i >$i.new && mv $i.new $i
fi
done
enter code here
Gerhard Gappmeierのブログ-ソースファイルのファイルヘッダーを再帰的に置き換えるHowto
ブログの投稿にはtar.gz
、必要なファイルを含むファイルが添付されています。
このheader.template
ファイルには、カスタムコメントを記述できるファイルがあり、複数行にわたることができます。
remove_header.awk
既存のヘッダーを新しいヘッダーに置き換えるスクリプトがあります。
実行するには:
find . -name "*.h" -exec ~/rh/replace_header.sh {} \;