디렉터리의 모든 .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그러나 쉘 옵션을 사용하는 경우 더 좋습니다.외부 전역 변수존재하다via shopt -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

관련 정보