找到“.ts”而不是“.d.ts”

mpe*_*pen 22 find

我认为这可以解决问题:

find src -type f -regextype egrep -regex '.*(?<!\.d)\.ts'
Run Code Online (Sandbox Code Playgroud)

但它似乎没有匹配任何东西。

我认为应该有效,但我想这种“egrep”风格不支持负反向引用,除非我没有正确地逃避某些事情。

以供参考,

 % find src -type f
src/code-frame.d.ts # <-- I want to filter this out
src/foo.ts
src/index.ts
Run Code Online (Sandbox Code Playgroud)

是否有另一种快速方法可以.d.ts从我的搜索结果中过滤掉文件?

 % find --version
find (GNU findutils) 4.7.0-git
Run Code Online (Sandbox Code Playgroud)

bxm*_*bxm 71

我不相信egrep支持该语法(您的表达式是 Perl 兼容的正则表达式)。但是您不需要在您的示例中使用正则表达式,只需进行多个-name测试并!酌情应用否定:

find src -type f -name '*.ts' ! -name '*.d.ts'
Run Code Online (Sandbox Code Playgroud)


Ste*_*itt 29

你可以通过只过滤文件名来得到你想要的结果,否定你不想要的文件的测试:

find src -type f -name \*.ts ! -name \*.d.ts
Run Code Online (Sandbox Code Playgroud)


ale*_*avi 6

一种简单(可能效率较低)的方法可以过滤掉不需要的字符串。

find -name "*.ts" | egrep -v "\.d\.ts$"
Run Code Online (Sandbox Code Playgroud)

  • 这将无法过滤掉名称以“.d.ts”结尾的文件,但在文件名的该部分之前也有一个换行符。这不太可能是技术性的,但 Unix 文件名可能包含换行符。 (5认同)
  • 此外,此类特殊情况(如果需要,或者存在安全问题)可以使用例如`find -name "*.ts" -print0 | 来处理。egrep -vzZ "\.d\.ts$" | xargs -0i printf '{}\n'`。我喜欢这个答案作为附加答案,因为它提供了在需要时进行更复杂处理的选项(`grep -P`、`perl -0` 等) (4认同)