바이너리 파일을 제외하고 디렉터리의 파일 경로를 반복적으로 바꿉니다.

바이너리 파일을 제외하고 디렉터리의 파일 경로를 반복적으로 바꿉니다.

디렉토리에 있는 파일(바이너리 파일 제외)의 문자열(위치 경로)을 재귀적으로 바꾸는 방법은 무엇입니까? 나는 명령을 시도했다

find . -type f -exec sed -i 's/foo/bar/g' {} +

그러나 이진 파일 및 기타 파일(*.o, *.c)의 문자열도 대체합니다. ".dependent"라는 이름의 모든 파일에서 문자열을 재귀적으로 바꾸고 싶습니다.

답변1

find . -type f -name "*.depend" -exec sed -i 's/foo/bar/g' {} +

또는

find . -type f -not -name "*.c" -not -name "*.o" -exec sed -i 's/foo/bar/g' {} +

       -name pattern
              Base of file name (the path with the leading directories
              removed) matches shell pattern pattern.  Because the leading
              directories are removed, the file names considered for a match
              with -name will never include a slash, so `-name a/b' will
              never match anything (you probably need to use -path instead).
              A warning is issued if you try to do this, unless the
              environment variable POSIXLY_CORRECT is set.  The
              metacharacters (`*', `?', and `[]') match a `.' at the start
              of the base name (this is a change in findutils-4.2.2; see
              section STANDARDS CONFORMANCE below).  To ignore a directory
              and the files under it, use -prune; see an example in the
              description of -path.  Braces are not recognised as being
              special, despite the fact that some shells including Bash
              imbue braces with a special meaning in shell patterns.  The
              filename matching is performed with the use of the fnmatch(3)
              library function.  Don't forget to enclose the pattern in
              quotes in order to protect it from expansion by the shell.

http://man7.org/linux/man-pages/man1/find.1.html

답변2

나는 이 코드를 작성했고 그것은 내 목적에 적합합니다.

find . -type f -exec grep -Iq . {} \; -exec sed -i 's|/foo|/bar|g' {} +

관련 정보