正则表达式:文件名中的负模式

时间:2018-12-13 08:25:56

标签: regex linux

昨天我因一个问题脱掉头发:

我拥有一个电子商务网站,我想删除一些不再有用的产品缩略图 在我的Linux Web服务器上,我想使用“ find iregex'...'-exec rm”命令行对它们进行擦除

以下是一些产品名称示例,它们全部位于同一目录中:

product.name-350x350.jpg
product.name-50x50.jpg
productname-120x120.jpg
product-name-120x120.jpg
product-name.jpg
product-name-120.jpg
product-name-120px.jpg

表明它是缩略图的子模式是:

-AAAAxAAAA.jpg(AAAA长度为1到4辆汽车)

因此,示例中的第4行仅是缩略图 我找到一个正则表达式来擦除所有属于缩略图子模式的jpeg

是:

-iregex '-([0-9]{1,4})x([0-9]{1,4}).jpg'

但是对于游戏,我问自己一个问题:“如何找到所有非缩略图的产品名称?”

我尝试没有结果:

[^(0-9{1,4}x0-9{1,4}.)]

并且在没有找到解决方案的情况下阅读了很多有关负正则表达式的内容。 你能帮忙吗?

塞巴斯蒂安。

2 个答案:

答案 0 :(得分:1)

[^xxx]是否定的字符类。它没有内部结构。 [^ABC][^CBA]是同一件事:“除字符'A','B'或'C'以外的所有内容” 。因此,这些事情与您假设的方式完全不同。

使用正则表达式进行负匹配通常要难得多(*),通常在外部进行否定比较容易,即与正则表达式匹配,但在使用正则表达式的工具中排除匹配项。

要否定条件,find具有-not

find -type f -regextype posix-extended -not -iregex '.*-[0-9]{1,4}x[0-9]{1,4}\.jpg'

由于纯黑名单很危险(您可能最终会匹配到您本来没有想到的东西),因此您应该将肯定模式(“所有图片...” )和排除模式( “ ......除外” )使用find支持的逻辑运算符。


(*)在正则表达式中排除匹配项的最便捷方法是负数lookaheads/lookbehinds。据我所知,find不支持这些构造。

答案 1 :(得分:0)

您可以将regexsed命令一起使用。这样可以避免使用D打印匹配项。

尝试一下:

find . -type f -iregex '.*[.]jpg' | sed '/-[1-9][0-9]\{0,3\}x[1-9][0-9]\{0,3\}[.]jpg$/D'

输出

./product-name.jpg
./product-name-120px.jpg
./product-name-120.jpg