2013-03-18 75 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

相關問題