2015-11-21 149 views
1

我想找到名称,如文件...(1-9)...正则表达式在命令行

find . -regex '.*/.*\([1-9]\).*' 

我第一次使用这一个,但它似乎给我1 - 所有文件9在他们的路上。 我尝试

find . -regex '.*/.*([1-9]).*' 

和它的作品。但我不知道为什么。我记得在正则表达式中括号是指表达式吗?或者你想稍后用\ 1,\ 2来引用它?这就是我使用反斜杠来逃避它的原因。

任何人都可以帮我吗? Thx

对不起我在这里混淆?我想要像书(1).pdf而不是book1.pdf 。 [1-9]。不可行?

+0

为什么不:'找到。 -regex'。* [1-9]。*''(你实际上不需要'-regex') – anubhava

+0

@anubhava他希望'[1-9]'出现在文件名中。 –

+0

@anubhava一个可能的答案是书(1).pdf,book1.pdf不是我要找的 –

回答

0

你甚至不需要find这个。只需使用全局正则表达式匹配([1-9)模式:

printf "%s\n" *\([1-9]\)* 

注意,这将列出的所有文件和子目录在当前路径与名称([1-9])

如果你只想列出这种模式文件,然后使用:

find . -maxdepth 1 -name '*([1-9])*' -type f 
+0

但为什么我的第一个正则表达式失败,但第二次工作? –

+0

Thx u也提供了一个有用的选项:) –

+0

'find。 -regex'。* /。*([1-9])。*''起作用,因为'('和')'作为文字圆括号。当你使用''。* /。* \([1-9] \)。*'',那么'('和')'作为正则表达式分组,因此任何带有[1-9]的文件/目录匹配。话虽如此,我在答案中显示的是更好的选择。 – anubhava

0

您需要使用否定字符类。

find . -regex '.*/[^/]*\([1-9]\)[^/]*$' 
+0

你的答案不起作用? –

+0

你检查过吗? –

+0

是的,可能与我使用第一个正则表达式的输出相同。顺便说一句,我重申......我的问题不清楚〜 –