디렉터리의 모든 파일과 하나를 제외한 모든 하위 디렉터리에 대해 일부 작업(예: 문자열 교체)을 어떻게 수행할 수 있나요?

디렉터리의 모든 파일과 하나를 제외한 모든 하위 디렉터리에 대해 일부 작업(예: 문자열 교체)을 어떻게 수행할 수 있나요?

다음 명령을 사용하고 있습니다

find . -type f -exec sed -i 's/_backpack.html/_backpack_cal.html/g' {} +

프로젝트의 모든 "_backpack.html" 문자열을 대체하고 싶은데 _backpack_cal.html이런 일이 발생합니다.

그러나 문제는 내 디렉토리 .git의 파일 도 편집하여 Git이 손상된다는 것입니다. 다른 모든 하위 디렉터리를 처리하는 동안 find내 디렉터리가 건드리지 않도록 하려면 어떻게 해야 합니까?.git

답변1

당신이 사용할 수있는:

find . -name .git -prune -o -type f -exec sed -i 's/_backpack.html/_backpack_cal.html/g' {} +

제가 추가한 부분은 -name .git -prune기본적으로 "디렉토리 이름이 이면 .git해당 디렉토리를 처리하지 않습니다." 라는 의미입니다.

또한 첫 번째 명령문이 false인 경우(즉, 처리 중인 파일 이름이 디렉토리인 경우 ) 에만 명령문을 실행한다는 추가 사항 -o(의미 )에 유의하세요.or.git

물론 실제로 명령을 실행하기 전에 이를 테스트해야 합니다. 예를 들어 -exec ...일부를 .-print

답변2

제외하려는 경우 .git:

find . ! -path '.git/*' -type f

모든 숨겨진 파일 및 디렉터리를 제외하려면:

find . ! -path '*/.*' -type f

관련 정보