폴더에 포함된 파일에서 해당 용어가 나타나는 모든 항목을 바꿉니다.

폴더에 포함된 파일에서 해당 용어가 나타나는 모든 항목을 바꿉니다.

내 시스템의 폴더에 C++컴파일하려는 프로젝트가 있습니다.

이 절차에서는 C++내 버전의 컴파일러가 지원하지 않는 일부 관용어를 사용합니다. 특히, 코드 내부에서 데이터 값이 사용되는 경우가 많습니다 'nullptr'.

내가 하고 싶은 것은 nullptr.NULL

다음 명령을 사용하여 이 작업을 수행할 수 있습니다 VIM.

:%s/nullptr/NULL/g 

각 파일을 열고 명령을 실행하지 않고 디렉터리의 모든 파일에 대해 이 작업을 어떻게 한 번 수행할 수 있습니까?

답변1

for file in /path/to/dir/*; do
  sed -i s/nullptr/NULL/g "$file"
done

그러나 이는 하위 디렉터리에는 영향을 미치지 않습니다.

편집 1

더 빠른 솔루션(GNU 사용):

find /path/to/dir -type f -print0 | xargs -0 sed -i s/nullptr/NULL/g

이는 하위 디렉터리(및 도트 파일)에도 영향을 미칩니다. -maxdepth 1필요하지 않은 경우 추가하세요.

답변2

이를 수행하는 방법에는 두 가지가 있습니다.

다음과 같이 명령줄에서 vim을 사용할 수 있습니다.

$ vim -c "%s/nullptr/NULL/g|wq" foo.txt

for 루프로 래핑됩니다.

$ for i in *; do vim -c "%s/nullptr/NULL/g|wq" -- "$i"; done

진주

$ perl -p -i -e 's/nullptr/NULL/g' foo.txt

for 루프로 래핑됩니다.

$ for i in *; do perl -p -i -e 's/nullptr/NULL/g' -- "$i"; done

또는 간단하게:

$ perl -p -i -e 's/nullptr/NULL/g' -- *

답변3

GNU 도구 사용:

grep -rlZ nullptr /path/to/dir |
  xargs -r0 sed -i s/nullptr/NULL/g

모든 파일을 다시 작성하지 마십시오.

언제나 그렇듯이 sed -i링크(하드 및 소프트)가 끊어지고, 파일의 소유권과 권한이 변경되고, 파일의 희박성 및 기타 잠재적으로 흔하지 않은 속성이 변경될 수 있다는 점을 명심하세요. 또한 grep이전 버전의 GNU는 .2.12-r

관련 정보