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