2011-11-16 116 views
1

如何删除当前目录中的所有文件 - 但不是那些在标题中有1.65的文件?Bash正则表达式

我试图捕捉这些文件与

*[^1][^\.][^6][^5]* 
*[^\(1\.65\)]* 

(可以按Alt-*扩大正则表达式)

,但它不工作。下面是实验代码:

touch foo1.65bar \#bla1.66 qbit0.65t 1.65boris [email protected] 
+2

顺便说一下,正则表达式不能像那样工作。如果有办法使它匹配,则正则表达式会找到它,并报告匹配。因此,对于您的正则表达式示例,正则表达式引擎会发现foo1.65bar匹配,因为'f'匹配'[^ 1]',第一个'o'匹配'[^。]'(不需要反斜杠,btw ),第二个'o'匹配'[^ 6]','1'匹配'[^ 5]'。这也是为什么有不同的正则表达式引擎和为什么globbing不使用正则表达式的解释;每个工具都适用于特定的目的。 – tripleee

回答

4

它往往是更可靠,更表现为使用找到这样的工作:

find -mindepth 1 -maxdepth 1 '(' -type f -and -not -name '*1\.65*' ')' -delete 
+1

+1,但不需要括号:) – unbeli

+2

@unbeli:够公平的。只要'-delete'在线上,我就倾向于把它们放在一起,以确保'find'使用* my *关于运算符优先顺序的想法。 – thiton

3

您可以使用extended globbing ..(庆典4)

touch a b c foo1.65bar foo1_65bar 
ls 
echo ====== 
shopt -s extglob 
rm !(*1.6*) 
ls 

输出

a b c foo1_65bar foo1.65bar 
===== 
foo1.65bar 
+0

谢谢,我从来没有听说过。从一个角度来看 - 支持正则表达式很酷。另一方面 - 不得不学习更多的正则表达式概念 - 为什么他们不符合[PCRE](http://en.wikipedia.org/wiki/Pcre)。 – Adobe

+1

@Adobe。我认为这是因为'bash'不得不将这个扩展匹配适应现有的框架,如果按照PCRE实现正则表达式,它将会中断.. –

+2

@Adobe这是因为PCRE与普通shell匹配太不同了,非常容易让外壳匹配的混淆与正常行为完全不同。例如,如果您键入'foo.txt'作为参数,并且PCRE匹配生效,它会将该句点与任何单个字符相匹配(相当于正常通配中的'foo?txt')。另一方面,'* .txt'是一个无效的RE,因为'*'的意思是“0或更多的最后一个东西”,并且在模式的开始处没有“最后的东西”。 –

0

你可以在Ruby,Python,Perl等文件名中使用像下面这样的正则表达式。然后你必须用所选语言编写一个小脚本或一个班轮来完成这项工作。它使用负向预测。 (CFR)。​​。

^((?!1\.65).)*$ 

如果你想建立一个正则表达式,将不是一个特定的字符串匹配,你不能因为它指定单个字符,而不是所有的人都在使用顺序[]。你必须使用lookaround结构。

+0

嗯 - 这对我来说太难了。但是,无论如何谢谢你的信息。 – Adobe