2013-03-06 20 views
1

我有一个目录列表,其中大多数格式为./[foobar]/。但是,有些格式为./[foo] bar/正则表达式 - 找到不匹配的文件

我想用find(或其他一些公用事业我的壳报价)找到这些目录匹配(即具有方括号外面的文字)的第一图案。到目前为止,我无法找到一种方法来“反转”我的模式。

任何方式来做到这一点?

+0

为了澄清 - 你正在寻找有''//字符之间的文本字符串相匹配的正则表达式是不是之间'[] '人物?这是否意味着任何不匹配'/[.*]/'的字符串 - 适当地转义'/'和'[]'字符,当然......?至于“匹配的东西是不是”...看到http://stackoverflow.com/questions/406230/regular-expression-to-match-string-not-containing-a-word – Floris 2013-03-06 17:14:39

回答

4

您可以将find与grep和-v选项结合使用。 find . -type d | grep -v "[foobar]"

+0

可能是最简单的解决方案。 – 2013-03-07 11:35:48

+0

这是不正确的。你需要切换到'grep -Fv'来切换到文字匹配,或者转义正则表达式特殊的'\ ['因为当前正则表达式将匹配任何包含'f'或'o'或'b'或' a''或'r'任何地方。 – tripleee 2018-02-21 04:59:14

1

find通过!-not支持否定。后者不符合POSIX标准。为了使用!,你必须在它之前加上反斜杠或将它放在单引号内。

2

一个简单的正水珠会在这个特殊的例子工作:

$ ls 
[a]b [ab] 
$ echo \[*\] 
[ab] 

对于更为复杂的模式可以启用extglob

!(pattern-list) 
    Matches anything except one of the given patterns 

and similar globs

或者使用find:

find dir ! -name ... 
+0

工程一般,但管道'发现'''grep'似乎更容易。 – 2013-03-07 11:37:04

+0

只要你不打算使用它,只要看看,这将是很好的,但我认为glob更容易(并且如果文件名中有空格,则更安全)。 – Kevin 2013-03-07 14:45:08

1
find -type d -name '*\]?*' 

除非你坚持开括号检验...