在 Unix 中查找扩展名为 .ts 或 .tsx 的所有文件?

在 Unix 中查找扩展名为 .ts 或 .tsx 的所有文件?

我有一个 React 应用程序,其中有些文件在其中.ts,有些文件在.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不是 的标准选项sedsed -i ""用法建议使用 FreeBSD 实现sed(也可在 macOS 上找到)。大多数其他sed实现要么不支持 a -i,要么需要""省略 a。

答案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, shell(至少版本 4.0,最好是 5.0 或更高版本,它修复了 globstar 实现中的一些错误),您可以使用 globbing 代替:

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

这使用了扩展匹配运算符,具体来说:

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

您需要首先启用 globstar ( shopt -s globstar) 和 extglob( shopt -s extglob)。

请注意,它会跳过隐藏文件,shopt -s dotglob如果您希望它们得到处理,请添加find

相关内容