如何使用正则表达式和find命令来过滤路径?

如何使用正则表达式和find命令来过滤路径?

我有一组这样的目录:

/level1/user01/dir01
/level1/user01/dir02
/level1/user01/dir03
/level1/user01/dir04
/level1/user02/dir01
/level1/user02/dir02
/level1/user02/dir03
/level1/user02/dir04
/level1/user03/dir01
/level1/user03/dir02
/level1/user03/dir03
/level1/user03/dir04

我想用find在每个用户的dir02目录下搜索扩展名为.oz的文件

我可以用

find /level1/ -name "*.oz"

但我只想只在目录 dir02 内搜索

这不起作用

find /level1/"[a-z][0-9]"/dir02 -name "*.oz"

答案1

如果您想在第一个参数中指定多个目录,那么这仅取决于您的 shell。因此,在 bash 和 zsh 以及类似的(csh 和 tcsh?)中,您只需使用 shell glob。 shell 将此 glob 扩展为您感兴趣的多个目录,并将它们提供给find,它可以采用多个参数。

find /level1/*/dir02 -name "*.oz"

几点补充:

  • 这里的语法是 glob,而不是正则表达式。
  • 无论如何,你的正则表达式是错误的。 (忽略引用)应该是/level1/[a-z]*[0-9]*/dir02。注意*s。
  • 另一种选择是-path, see man find,但这比仅使用 shell glob 更复杂。

答案2

find使用with 的替代解决方案-path

$ find /level1 -type f -path "/level1/user??/dir02/*.oz" -print

这将打印(完整)路径匹配的所有常规文件的路径/level1/user??/dir02/*.oz

如果您知道这些文件位于该dir02目录中(而不是其子目录中),那么这将列出它们:

printf '%s\n' /level1/user??/dir02/*.oz

相关内容