【问题标题】:find/globbing: what am I doing wrong here?查找/查找:我在这里做错了什么?
【发布时间】:2019-12-07 01:37:36
【问题描述】:

希望是一个简短的问题,我很生气以至于我自己似乎无法弄清楚:

我正在尝试列出文件名中只有主要版本的所有 Mac 库,如

libFoo.X.dylib

其中 X 是小数(在我的例子中是单个数字)。

我正在使用

find /path/to/here -name "lib[^.]*.[0-9].dylib"

认为这应该给我包含的文件名 - 以“lib”开头且没有点的部分 - 一个点 - 一个数字 - .dylib 扩展名

但我也得到了libfoo.0.1.2.dylib 类型的文件,所以我的假设一定有问题。

【问题讨论】:

  • -nameaccepts shell globing 模式,而不是正则表达式。请改用-regex。在 Linux 中始终使用man 页面,这是信息的第一来源。
  • 呃,我在问这里之前当然做了 RTFM(很明显我不是在 linux 上做这个!)。你是说 shell glob[b]ing 不能做我想做的事吗?
  • @RJVB, ...由 bash 实现,shell globbing 确实足够强大,可以做你想做的事,因为它有可选的 extglob 语法(启用shopt -s extglob+([^.]) 匹配一个-或更多非点的东西)——但对于find,你需要传统的fnmatch风格的通配符,它​​确实没有“零或多”或“一或多”修饰符,所以你可以'不要说你想在一个位置上放任意数量的非点的东西;因此需要适当的正则表达式。

标签: regex shell wildcard glob


【解决方案1】:

您可以将此find-regex 选项一起使用:

find /path/to/here -regex '.*/lib[^.]*\.[0-9]\.dylib'

变化是:

  • 使用-regex 选项匹配正则表达式
  • .*/ 在开头允许路径名在文件名之前匹配
  • 点必须在正则表达式中转义以匹配文字点

【讨论】:

  • 谢谢,我想我最终也会得出这个公式,但这为我节省了很多时间。我认为插入符号在这里是多余的,就像(在我的情况下)$
  • 你实际上不需要最后的$-regex 模式默认锚定在两端,这就是为什么你需要在前面的 .*
  • @RJVB 在 Tcl 中,您需要使用 {...} 而不是 -regex 的参数周围的单引号,否则它应该可以正常工作。
  • @anubhava 是的。如果它们没有被锚定,你就不需要前面的.*;因为它们是,所以你不需要后面的$。将它们仅固定在一端会很奇怪,这是您同时需要 .*$ 的唯一方法。
  • @anubhava:使用{} 只是消除了引用的需要,但我想今晚我需要更多的睡眠......我忘记在@ 之前删除-name 987654339@ 参数:-/
猜你喜欢
  • 2017-09-29
  • 2013-08-27
  • 1970-01-01
  • 1970-01-01
  • 2016-03-03
  • 2013-06-28
  • 2023-01-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多