Linux에서 오류 없이 검색 및 교체를 수행하려면 어떻게 해야 합니까?
$ git status
On branch main
Your branch is up to date with 'origin/main'.
nothing to commit, working tree clean
$ find . -not -path './.git' -type f -exec sed -i -e 's/old/new/g' -e 's/old2/new2/g' {} +
$ git status
fatal: unknown index entry format 0x74650000
문자열 old
과 new
자리 표시자입니다.
답변1
-path
테스트 find
경기모두이름. man find
(강조 내) 에서 :
-경로 모드
파일 이름은 쉘 패턴과 일치합니다. 메타문자는
/' or
특별히 처리되지 않습니다 . 예를 들어 다음과 같습니다.find . -path "./sr*sc"
./src/misc라는 디렉토리에 대한 항목이 있으면 인쇄됩니다. 전체 디렉토리 트리를 무시하려면 트리의 모든 파일을 확인하는 대신 -prune을 사용하십시오. 패턴 일치 테스트는 명령줄에 명명된 시작점 중 하나부터 시작하여 전체 파일 이름에 적용됩니다.. 여기서 절대 경로 이름을 사용하는 것은 관련 시작점이 절대 경로인 경우에만 의미가 있습니다. 이는 명령이 어떤 것과도 일치하지 않음을 의미합니다.
find bar -path /foo/bar/myfile -print
Find는 -path 인수를 디렉터리 이름과 확인 중인 파일의 기본 이름의 연결과 비교합니다. 연결은 슬래시로 끝나지 않으므로 슬래시로 끝나는 -path 인수는 어떤 것과도 일치하지 않습니다(명령줄에 지정된 시작점 제외). HP-UX find는 POSIX 2008 표준의 일부인 -path 조건자를 지원합니다.
따라서 -not -path './.git'
실제로는 아무것도 제외하지 않습니다. 예를 들어, 내 저장소 중 하나에서:
$ find . -not -path './.git' -type f | grep -m5 git
./.git/COMMIT_EDITMSG
./.git/logs/HEAD
./.git/logs/refs/heads/master
./.git/description
./.git/HEAD
./git/
다음 과 같이 문자로 시작하고 뒤에 문자가 오는(또는 문자가 없는) 파일을 제외하는 것을 사용하려고 합니다 .
find . -not -path './.git/*' -type f
하지만 그것조차도 당신이 정말로 원하는 것은 아닙니다. 전체 하위 디렉토리를 건너뛰고 싶을 뿐인데 ./.git
, -prune
위에서 인용한 매뉴얼 페이지에 다음과 같은 내용이 나와 있습니다.
find . -type f \( -path './.git/*' -o -print \)