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 {} \;