为什么 find -regex 在不同的机器上工作不同?

为什么 find -regex 在不同的机器上工作不同?

所以我得到了以下find命令:

find ./test-folder -type d -mindepth 1 -regex "^.*/\d\{4\}-\d\{2\}-\d\{2\}$"

之前我已经创建了该文件夹./testfoldermkdir testfolder在其中创建了一个文件夹mkdir ./testfolder/2022-10-12

当在基于 alpine 的 docker 容器中使用 Bash 运行find命令时,一切正常并且输出/path/to/testfolder/2022-10-12

如果我在 Lubuntu 机器上的 bash 中运行相同的命令,它不会输出任何内容。

我没有修改 find 命令或它周围的任何内容,我希望它可以在任何机器上工作,但正则表达式似乎表现不同。匹配*有效,也可以匹配无限多个数字\d*,但是一旦我尝试匹配-或使用量词,{4}它就不再匹配任何内容。

这里可能有什么问题?另外,我怎样才能让它在LUbuntu上运行呢?

答案1

从评论中我推断出实际的问题是“如何匹配\d{4}-\d{2}-\d{2}LUbuntu 上的等效项”。

问题有两个:

  1. 首先,如中所解释的为什么 Alpine 上的“查找”命令似乎需要转义“?”但在 Ubuntu 上不行?,AlpineLinux 和 LUbuntu 上的默认 RegEx 语法是不同的。
  2. 其次,\d 字符类是“PCRE”样式扩展find基本正则表达式的一部分, Lubuntu 附带的GNU 不支持。

因此,您应该使用该-regextype选项显式选择具有所需功能的 RegEx 类型,然后遵循该样式。在你的情况下,你可以使用扩展正则表达式

find ./testfolder/ -mindepth 1 -regextype "egrep" -regex '^.*/[[:digit:]]{4}-[[:digit:]]{2}-[[:digit:]]{2}$'

相关内容