디렉토리의 모든 .h 및 .cpp 파일에 대해 라이센스 헤더를 재귀 적으로 추가하는 방법 파일과 소스 파일에 라이센스 헤더를 추가하려고합니다.

for 루프를 사용하여 프로젝트 디렉토리의 모든 헤더 파일과 소스 파일에 라이센스 헤더를 추가하려고합니다. 이것은 작동하지 않습니다. 사용하는 다른 방법이 sed있습니까?



답변

for f in **/*.cpp; do
  cat header_file $f > $f.new
  mv $f.new $f
done

답변

이것은 Daniel Serodio의 대답 에 대한 확장 된 주석입니다 . 주석으로 작성하기 시작했지만 너무 빨리 커졌습니다 …

bash glob가 재귀 적이어야하려면 shopt -s globstar. globstar를 활성화해야합니다 **. 그렇지 않으면 작동하지 않습니다. globstar 쉘 옵션은 bash 버전 4에 도입되었습니다.

과 같은 디렉토리를 처리하지 않으려면 my.cpp/test [[ -f $f ]]…를 사용하십시오 . 테스트가 큰 대괄호 안에 있으면 변수를 큰 따옴표로 묶을 필요가 없습니다.

또한 파일을 사용 shopt -s nullglob하지 않는 패턴을 자체가 아닌 null 문자열로 확장 할 수있는 을 사용하여 일치하는 파일이 없을 가능성을 고려할 수 있습니다 .

여러 패턴을 처리하기 위해, 당신은 글로브 패턴을 체인 수 **/*.cpp **/*.h있지만, 쉘 옵션의 경우 아마도 양호하게는, extglob가 있습니다 통해 shopt -s extglob, 당신은 같은 구조 사용할 수있는 **/*.@(cpp|h)파일 시스템을 통해 다중 패스를 피할 수있는을; 각 패턴마다 한 번씩.

당신이 원하는 경우에 .files포함되는, 사용 .*.cpp등, 또는 사용shopt -s dotglob

파이프되는 파일 수정을 안전하게 처리하려면 sponge패키지 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

답변

@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가 제안한 것을 완전히 이해할 수 없었습니다.


답변

이 작업을 수행 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

답변

header_file원하는 내용 이있는 경우 :

find -name '*.cpp' -exec bash -c 'cat header_file \{} > \{}.new; mv \{}.new  \{}' \;
find -name '*.h' -exec bash -c 'cat header_file \{} > \{}.new; mv \{}.new  \{}' \;

답변

#!/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의 블로그-소스 파일의 파일 헤더를 재귀 적으로 대체하는 방법

블로그 게시물에 tar.gz필요한 파일이 포함 된 파일 이 첨부되었습니다 .

여기에는 header.template사용자 정의 주석을 작성할 수 있는 파일 이 있으며 여러 줄에 걸쳐있을 수 있습니다.

그것은이 remove_header.awk새로운 헤더가 기존 헤더를 대체 스크립트를.

그것을 실행하려면 :

find . -name "*.h" -exec ~/rh/replace_header.sh {} \;