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つのコマンドにまとめる方法はありますか?

答え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標準オプションではないことに注意してくださいsedsed -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

関連情報