【问题标题】:Can a Bash extended globbing pattern be used to match a path NOT containing specific characters可以使用 Bash 扩展的通配符模式来匹配不包含特定字符的路径吗
【发布时间】:2013-03-18 20:38:34
【问题描述】:

在 bash 脚本中,我想查找路径不包含带有 “双扩展名” 的子目录的文件。例如,如果我在 /my/home 的子目录中查找 path/to/my/file 并且存在以下内容,则脚本将仅找到第一个:

/my/home/subdirectory.1/path/to/my/file
/my/home/subdirectory.1.2/path/to/my/file

这是一个简化的例子:12 可以是任何字符串;关键是它们就像文件扩展名(即用句点分隔)。

我可以使用ls

$ ls /my/home/subdirectory.*/path/to/my/file

但这两者都返回 - 我想用 .[^.]* 替换 .* 但这是一个正则表达式,并且通配符不使用正则表达式。我已经尝试过扩展通配符,但我无法让它工作(我很高兴承认我不熟悉扩展通配符):

$ shopt -s extglob
$ ls /my/home/subdirectory.!(.*)/path/to/my/file

我知道我可以像这样使用find 这样做:

$ find /my/home/subdirectory* -regex "/my/home/subdirectory.[^.]*/path/to/my/file"

但我希望 glob 更快。但是,在阅读了此内容后,我认为这超出了 Bash 的 globbing、扩展或其他方式的能力。但我认为这是一个值得讨论的好问题。

【问题讨论】:

    标签: regex bash glob


    【解决方案1】:

    我想你想要的是

    ls /my/home/direcectory.+([!.])/path/to/my/file
    

    将匹配扩展名中的一个或多个非. 字符。

    【讨论】:

    • 请注意,可以使用克拉 (^) 代替感叹号。
    【解决方案2】:

    试试:

    ls /my/home/subdirectory!(.*.*)/path/to/my/file
    

    ls /my/home/subdirectory.!(*.*)/path/to/my/file
    

    取决于您是否希望匹配没有扩展名的目录。

    【讨论】:

    • 我喜欢你的回答,因为它们很容易理解,但是@chepner 的回答也忽略了/my/home/directory./path/to/my/file,因此更加严格。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-09
    相关资源
    最近更新 更多