2

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

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

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

我可以用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、扩展或其他方式的能力。但我认为这是一个值得讨论的好问题。

4

2 回答 2

2

尝试:

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

或者

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

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

于 2013-03-18T20:59:57.870 回答
2

我想你想要的是

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

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

于 2013-03-18T21:00:15.567 回答