GNU는 이것을 찾고 저것을 찾지 않고 Sed를 실행합니까?

GNU는 이것을 찾고 저것을 찾지 않고 Sed를 실행합니까?

암호

find /tmp/ -type f                                      \
    \( -name "*.h" \) -o \( -name "*.cpp" \) -o         \
    \( \! -name "*.bak" \) -exec                        \
    sed -i '1s/^/#include <stdint.h>\n/' {} +

이것이 올바른 접근 방식인지 완전히 확신하지 못합니다. 임시 파일을 사용하지 않고 파일에 직접 씁니다. 줄의 시작 부분을 바꾸고 싶습니다.. 시간그리고.cpp파일에 다음이 포함되어 있지만 포함되어 있지 않습니다..bak문서.

효율적인 교체를 수행하는 방법은 무엇입니까? 참고: 저는 GNU를 사용하고 있습니다 sed.


오류에 적용된 파일을 삽입하기 위해 Terdon의 명령을 시도했습니다.

$ cat test.sh 
gfind /tmp/ -type f   \
    \( -name "*.h" -o -name "*.cpp" -o ! -name "*.bak" \) \
    -exec gsed -i '1s/^/#include <stdint.h>\n/' {} +    
$ sh test.sh 
$ cat test.sh    
#include <stdint.h>
gfind /tmp/ -type f   \
    \( -name "*.h" -o -name "*.cpp" -o ! -name "*.bak" \) \
    -exec gsed -i '1s/^/#include <stdint.h>\n/' {} +

거기에 있는 모든 명령은 GNU: find 및 sed입니다.

답변1

이 시도:

find /tmp/ -type f  -name "*.h" -o -name "*.cpp"  \
           -exec  sed -i '1s/^/#include <stdint.h>\n/' {} +

또한 내가 올바르게 지적했듯이 이것은 ! -name "*.bak"중복됩니다. 패턴은 -name *foo과만 일치합니다 foo. 따라서 *.cpp은(는) *.h제외되었습니다 *.bak.

관련 정보