나는 이 난교를 가지고 있습니다:
replace="s/AAAA/BBBB/g";
find myDirectory/. -type f -print0 | xargs -0 sed -i $replace;
이것은 트리를 재귀적으로 스캔하고 그 안에 있는 모든 파일을 myDirectory
대체 합니다.AAAA
BBBB
하지만 특정 확장자를 가진 파일에서만 이런 일이 발생하도록 제한하고 싶습니다 .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