我有一个 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
不是 的标准选项sed
。sed -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
。