如何删除当前目录中的所有文件 - 但不是那些在标题中有1.65
的文件?Bash正则表达式
我试图捕捉这些文件与
*[^1][^\.][^6][^5]*
*[^\(1\.65\)]*
(可以按Alt-*
扩大正则表达式)
,但它不工作。下面是实验代码:
touch foo1.65bar \#bla1.66 qbit0.65t 1.65boris [email protected]
如何删除当前目录中的所有文件 - 但不是那些在标题中有1.65
的文件?Bash正则表达式
我试图捕捉这些文件与
*[^1][^\.][^6][^5]*
*[^\(1\.65\)]*
(可以按Alt-*
扩大正则表达式)
,但它不工作。下面是实验代码:
touch foo1.65bar \#bla1.66 qbit0.65t 1.65boris [email protected]
您可以使用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
谢谢,我从来没有听说过。从一个角度来看 - 支持正则表达式很酷。另一方面 - 不得不学习更多的正则表达式概念 - 为什么他们不符合[PCRE](http://en.wikipedia.org/wiki/Pcre)。 – Adobe
@Adobe。我认为这是因为'bash'不得不将这个扩展匹配适应现有的框架,如果按照PCRE实现正则表达式,它将会中断.. –
@Adobe这是因为PCRE与普通shell匹配太不同了,非常容易让外壳匹配的混淆与正常行为完全不同。例如,如果您键入'foo.txt'作为参数,并且PCRE匹配生效,它会将该句点与任何单个字符相匹配(相当于正常通配中的'foo?txt')。另一方面,'* .txt'是一个无效的RE,因为'*'的意思是“0或更多的最后一个东西”,并且在模式的开始处没有“最后的东西”。 –
你可以在Ruby,Python,Perl等文件名中使用像下面这样的正则表达式。然后你必须用所选语言编写一个小脚本或一个班轮来完成这项工作。它使用负向预测。 (CFR)。。
^((?!1\.65).)*$
如果你想建立一个正则表达式,将不是一个特定的字符串匹配,你不能因为它指定单个字符,而不是所有的人都在使用顺序[]
。你必须使用lookaround结构。
嗯 - 这对我来说太难了。但是,无论如何谢谢你的信息。 – Adobe
顺便说一下,正则表达式不能像那样工作。如果有办法使它匹配,则正则表达式会找到它,并报告匹配。因此,对于您的正则表达式示例,正则表达式引擎会发现foo1.65bar匹配,因为'f'匹配'[^ 1]',第一个'o'匹配'[^。]'(不需要反斜杠,btw ),第二个'o'匹配'[^ 6]','1'匹配'[^ 5]'。这也是为什么有不同的正则表达式引擎和为什么globbing不使用正则表达式的解释;每个工具都适用于特定的目的。 – tripleee