forループを使用して、プロジェクトディレクトリのすべてのヘッダーとソースファイルにライセンスヘッダーを追加しようとしています。動作しません。他の方法を使用できますかsed
?
答え1
shopt -s globstar
for f in **/*.cpp; do
cat header_file "$f" > "$f.new" && mv "$f.new" "$f"
done
メモ:
- これは、ディレクトリツリーへのフル(読み取り+書き込み+実行)アクセス権があると仮定します。
- すべての
.cpp
ファイルはあなたのファイルとして再生成され、デフォルトの権限を持ちます。ハードリンク(存在する場合)が破損しています。
答え2
これはほぼぴったりです。ダニエル・セロディオ答え。コメントで書き始めましたが、すぐに大きくなりすぎました...
bash globを再帰的に作成するには、shopt -s globstar
globstarを有効にする必要があります。それ以外の場合は**
動作しません。 globstarシェルオプションはbashバージョン4で導入されました。
my.cpp/
test などのディレクトリを扱わないようにするには、[[ -f $f ]]
テストを大括弧で囲むときに変数を二重引用符で囲む必要はありません。
を使用して、一致するファイルがない可能性を検討することもできますshopt -s nullglob
。これにより、ファイルと一致しないパターンを自分ではなく空の文字列に拡張できます。
複数のパターンを処理するには、globパターンをリンクできます。**/*.cpp **/*.h
ただし、シェルオプションを使用している場合はより良いです。外部グローバル変数はい存在するviashopt -s extglob
を使用すると、たとえば、パターン**/*.@(cpp|h)
ごとに一度にファイルシステムを複数回移動することを防ぐことができます。
.files
これを含めるには、.*.cpp
etcを使用するか、shopt -s dotglob
パイプされたファイルの変更を安全に処理するには、sponge
from packageを使用します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
答え3
@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の提案をよく理解できません。
答え4
#!/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