2013-03-18 44 views
1

在bash脚本中,我希望找到其路径不包含具有“双扩展名”的子目录的文件。例如,如果我期待在/my/homepath/to/my/file子目录和下面存在,脚本将查找只有第一个:是否可以使用Bash扩展匹配模式来匹配不包含特定字符的路径

/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,extended或其他的能力。但我认为这是一个值得讨论的好问题。

回答

1

我想你想要的是

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

将在扩展匹配一个或多个非.字符。

+0

请注意,可以使用克拉('^')代替感叹号。 – 2014-03-10 20:14:55

2

尝试:这取决于你是否愿意目录,而扩展

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

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

要匹配与否。

+1

我喜欢你的答案,因为他们很容易理解,然而@chepner的答案也忽略了'/ my/home/directory。/ path/to/my/file',因此有点严格。 – starfry 2013-03-19 08:43:24