POSIX glob - 如何匹配一个或多个[:digit:]

时间:2016-06-27 21:28:25

标签: linux posix sh glob

我希望迭代foo.log及其日志旋转的兄弟foo.1.gzfoo.2.gz从最新到最旧,代码不会因{{1}的存在而被愚弄}}

令人高兴的是,foo.bar将最新到最旧和按字母顺序排列的内容命名为相同的顺序。

我原来的尝试是logrotate,但for f in $(ls -t foo.*); do ...shellcheck。此外,此代码与Iterating over ls output is fragile. Use globs. [SC2045]匹配,这是不可取的。

但是如何使用glob模式匹配任意数量的数字?(或者这不受支持?)我只知道如何明确列出每个数字位数。例如,以下句柄处理1位和2位数字并正确排除foo.bar但不处理foo.1bar.gz(并且我没有做正确的事情导致foo.123.gz要发生!)

glob

我可以假设没有人保留超过100个日志旋转的兄弟姐妹,但我不愿意。

寻找符合POSIX标准的解决方案......

编辑:logrotate conf会压缩某些文件,而不会压缩其他文件。因此,并非所有兄弟姐妹都以for f in foo.log foo.[[:digit:]].gz foo.[[:digit:]][[:digit:]].gz; do ...结束。

2 个答案:

答案 0 :(得分:1)

glob模式不是正则表达式。有关语法,请参阅glob(7)。

没有用于匹配一系列数字的glob模式。你可以靠近foo.[0-9]*.gz。如果你选择了一些你不想要的名字,你可以用正则表达式过滤它们,可能是这样的:

echo foo.[0-9]*.* | tr ' ' \\n | grep -E '[.][0-9]+([.]gz)?$' 

考虑到您提出的约束,您可以使用glob模式并依赖shell进行排序。您可以使用 sort 检查shell是否按排序顺序呈现glob模式的文件名:

echo foo.[0-9]*.gz | tr \  \\n | sort -c

但是,除非你非常严格,否则解析ls -t的输出也是可以的。来自shellcheck的指导是一个很好的建议:许多人似乎想要在简单的glob做的时候解析ls输出,并依赖于ls在不同的系统中以相同的方式行事是邀请错误。也就是说,您只需要ls按时间对文件名进行排序,从而生成一列输出。你可能做的任何其他事情都会更容易出错。

答案 1 :(得分:-1)

由于[:digit:]的意思是[0-9],如果要匹配一个或多个数字,请结合使用“一个或多个”运算符。

结果: +([0-9])

需要测试全局模式吗? DigitOceans在这里发布了一个不错的工具。 https://www.digitalocean.com/community/tools/glob

祝你好运!