Unix에서 확장자가 .ts 또는 .tsx인 모든 파일을 찾으시겠습니까?

Unix에서 확장자가 .ts 또는 .tsx인 모든 파일을 찾으시겠습니까?

.ts일부 파일이 포함된 React 애플리케이션이 있고.tsx

현재 .ts 및 .tsx 파일의 내용을 업데이트하려면 2개의 개별 명령을 실행해야 합니다.

internal-web main % cd src
src main % find . -name '*.tsx' -print0 | xargs -0 sed -i "" "s/SomeThing/SOME_THING/g"
src main % find . -name '*.ts' -print0 | xargs -0 sed -i "" "s/SomeThing/SOME_THING/g"

.ts 및 .tsx 파일을 동시에 업데이트할 수 있도록 이 명령을 하나의 명령으로 결합하는 방법이 있습니까?

답변1

넌 할 수있어:

find . \( -name '*.tsx' -o -name '*.ts' \) -print0 | 
    xargs -0 sed -i "" "s/SomeThing/SOME_THING/g"

sed또는 훨씬 더 간단하고 이식성이 뛰어납니다( 파일을 찾을 수 없을 때 발생하는 오류 방지 ).

find . \( -name '*.tsx' -o -name '*.ts' \) -exec sed -i "" "s/SomeThing/SOME_THING/g" {} +

어쨌든 이것은 -i표준 옵션이 아니라는 점에 유의하십시오 sed. sed -i ""FreeBSD 구현을 사용하는 것이 좋습니다 sed(macOS에서도 사용 가능). 대부분의 다른 sed구현에서는 a를 지원하지 않거나 a를 생략 -i해야 합니다 "".

답변2

-regex대신 결합된 필터를 사용할 수 있습니다 -name. 다음 파일이 주어지면

src/
src/subdir-2
src/subdir-2/not-interesting.tsn
src/subdir-2/bar.ts
src/subdir-2/bar.tsx
src/subdir-2/not-interesting.not
src/subdir-1
src/subdir-1/not-interesting.tsn
src/subdir-1/foo.tsx
src/subdir-1/foo.ts
src/subdir-1/not-interesting.not

다음 명령을 사용하여 필터링 .ts하고 .tsx파일링 할 수 있습니다.find src/ -regex '.+\.tsx?$'

src/subdir-2/bar.ts
src/subdir-2/bar.tsx
src/subdir-1/foo.tsx
src/subdir-1/foo.ts

답변3

find이 경우에는 실행할 필요가 없습니다. bash쉘(globstar 구현의 일부 버그를 수정하는 버전 4.0 이상, 바람직하게는 5.0 이상)을 사용하는 경우 대신 globbing을 사용할 수 있습니다.

sed -i "" "s/SomeThing/SOME_THING/g" ./**/*.ts?(x)

이는 특히 다음과 같은 확장 일치 연산자를 사용합니다.

'?(PATTERN-LIST)'
     Matches zero or one occurrence of the given patterns.

shopt -s globstar먼저 globstar( ) 및 extglob( )를 활성화해야 합니다 shopt -s extglob.

숨겨진 파일은 건너뛰고, shopt -s dotglob처리되기를 원하면 추가하세요 find.

관련 정보