특정 파일 확장자에 대한 문자열 검색 및 바꾸기

특정 파일 확장자에 대한 문자열 검색 및 바꾸기

나는 이 난교를 가지고 있습니다:

  replace="s/AAAA/BBBB/g";
  find myDirectory/. -type f -print0 | xargs -0 sed -i $replace;

이것은 트리를 재귀적으로 스캔하고 그 안에 있는 모든 파일을 myDirectory대체 합니다.AAAABBBB

하지만 특정 확장자를 가진 파일에서만 이런 일이 발생하도록 제한하고 싶습니다 .txt..read.po

이 제한을 어떻게 부과합니까?

답변1

-name찾기 옵션을 사용하여 파일 이름을 기준으로 일치 항목을 제한할 수 있습니다 .

find myDirectory/. -type f -name '*.txt' -print0 | xargs -0 sed -i "$replace"

여러 확장 프로그램의 경우 -o(또는)을 사용하여 그룹화 할 수 있습니다 ().

find myDirectory/. -type f \( -name '*.txt' -o -name '*.read' \) -print0 | xargs -0 sed -i "$replace"

-exec대신에 사용할 수 있는 또 다른 개선 사항은 xargs이식성이 뛰어나고 하위 쉘을 제거하는 것입니다.

find myDirectory/. -type f -name '*.txt' -exec sed -i "$replace" {} +

답변2

다음 설정을 다음 항목에 추가하세요 .bashrc.

shopt -s extglob globstar

extglob좀 더 열어봐무늬, @(…)분리형 구조를 포함합니다. 재귀 디렉터리 탐색을 globstar활성화합니다 .**/

그러면 다음을 사용할 필요가 없습니다 find.

sed -i "$replace" mydirectory/**/*.@(txt|read|po)

zsh에서는 특별한 옵션이 필요하지 않습니다. 그냥 실행하십시오.

sed -i $replace mydirectory/**/*.(txt|read|po)

파일이 많은 경우 "명령줄 길이 제한을 초과했습니다."와 같은 메시지가 표시될 수 있습니다. 그러나 최신 Linux 시스템의 한계는 매우 높으며 이러한 한계가 발생할 가능성은 거의 없습니다.

답변3

나는 이것을 성공적으로 시도했습니다 - DBA 존재를 AOS로 대체

sed -i -E "s/DBA/AOS/g" *.sh

관련 정보