查找:名称中的正则表达式

查找:名称中的正则表达式

假设我写:

find . -regex "[0-9]{4}-[0-9]{2}-[0-9]{2}-(foo|bar).csv.gz" -printf "%f\n"

在我看来,这个命令应该有效。我已经迭代了各种正则表达式类型选项和各种正则表达式格式,但无法让这种正则表达式通过查找来工作。关于 find 和正则表达式解析器,我在这里犯了一些简单的错误吗?

答案1

查找-name不采用正则表达式(这在问题的原始版本中使用)。它需要 shell glob,但这不是有效的 shell glob。您想要使用该-regex测试,但还需要告诉它使用扩展正则表达式或任何其他能够理解{N}foo|bar符号的风格。最后,与 不同的是-name-regex测试会查看整个路径名,因此您需要如下所示的内容:

$ find . -regextype posix-extended -regex ".*/[0-9]{4}-[0-9]{2}-[0-9]{2}-(foo|bar).csv.gz" -printf "%f\n"
5678-34-56-bar.csv.gz
1234-12-12-foo.csv.gz

如果你想使用-name,你可以这样做:

find . \( \
       -name "[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]-foo.csv.gz" \
    -o -name "[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]-bar.csv.gz" \
       \) -printf "%f\n"

答案2

另一种选择是fd工具:

fd '[0-9]{4}-[0-9]{2}-[0-9]{2}-(foo|bar).csv.gz'

https://github.com/sharkdp/fd

答案3

如果您有合理的文件名(至少在这个文件夹中),您可以运行以下命令

 find . | grep -E '[0-9]{4}-[0-9]{2}-[0-9]{2}-(foo|bar).csv.gz'

这样您就可以从各种 grep 选项中受益。

相关内容