【发布时间】: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
这是一个简化的例子:1 和 2 可以是任何字符串;关键是它们就像文件扩展名(即用句点分隔)。
我可以使用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、扩展或其他方式的能力。但我认为这是一个值得讨论的好问题。
【问题讨论】: