ディレクトリ内のすべての.hファイルと.cppファイルにライセンスヘッダーを繰り返し追加する方法

ディレクトリ内のすべての.hファイルと.cppファイルにライセンスヘッダーを繰り返し追加する方法

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 globstarglobstarを有効にする必要があります。それ以外の場合は**動作しません。 globstarシェルオプションはbashバージョン4で導入されました。

my.cpp/test などのディレクトリを扱わないようにするには、[[ -f $f ]]テストを大括弧で囲むときに変数を二重引用符で囲む必要はありません。

を使用して、一致するファイルがない可能性を検討することもできますshopt -s nullglob。これにより、ファイルと一致しないパターンを自分ではなく空の文字列に拡張できます。

複数のパターンを処理するには、globパターンをリンクできます。**/*.cpp **/*.hただし、シェルオプションを使用している場合はより良いです。外部グローバル変数はい存在するviashopt -s extglobを使用すると、たとえば、パターン**/*.@(cpp|h)ごとに一度にファイルシステムを複数回移動することを防ぐことができます。

.filesこれを含めるには、.*.cppetcを使用するか、shopt -s dotglob

パイプされたファイルの変更を安全に処理するには、spongefrom 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

関連情報