Linux POSIX glob——如何匹配一个或多个[:位:]

Linux POSIX glob——如何匹配一个或多个[:位:],linux,posix,sh,glob,Linux,Posix,Sh,Glob,我想从最新到最旧迭代foo.log及其日志循环兄弟foo.1.gz和foo.2.gz,代码不会被foo.bar的存在所愚弄 幸运的是,logrotate对事物进行命名,使得从最新到最旧以及字母顺序相同 我最初的尝试是以$(ls-tfoo.*)表示f;做…但是外壳检查说迭代ls输出是脆弱的。使用地球仪。[SC2045]。另外,此代码与不需要的foo.bar匹配 但是如何将任意数量的数字与全局模式匹配?(或者这不受支持?)我只知道如何明确列出每个数字。例如,下面的代码处理1位和2位数字,并正确排除f

我想从最新到最旧迭代
foo.log
及其日志循环兄弟
foo.1.gz
foo.2.gz
,代码不会被
foo.bar的存在所愚弄

幸运的是,
logrotate
对事物进行命名,使得从最新到最旧以及字母顺序相同

我最初的尝试是
以$(ls-tfoo.*)表示f;做…
但是
外壳检查
迭代ls输出是脆弱的。使用地球仪。[SC2045]
。另外,此代码与不需要的
foo.bar
匹配

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

foo.log foo.[[:digit:][].gz foo.[[:digit:][[:digit:][].gz中f的
;执行…

我可以假设没有人拥有超过100个日志旋转的兄弟姐妹,但我宁愿不这样做

正在寻找符合POSIX的解决方案


编辑:logrotate conf对某些文件进行压缩,而不对其他文件进行压缩。因此,并非所有的同级都以
.gz
结尾。glob模式不是正则表达式。有关语法,请参见glob(7)

没有匹配一系列数字的全局模式。您可以使用
foo.[0-9]*.gz
接近。如果它选择了一些你不想要的名字,你可以用正则表达式过滤掉它们,比如:

echo foo.[0-9]*.* | tr ' ' \\n | grep -E '[.][0-9]+([.]gz)?$' 
考虑到您提供的约束,您可能可以使用glob模式并依赖shell进行排序。您可以检查shell是否以sort排序顺序呈现全局模式的文件名:

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

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

因为
[:digit::
表示
[0-9]
,如果要匹配一个或多个数字,请结合使用“一个或多个”运算符

结果:
+([0-9])

需要测试glob模式吗?DigitOceans在这里发布了一个很好的工具。


祝你好运

啊,但是
foo.*.gz
匹配
foo.bar.log.1.gz
,这是
foo.bar.log
的第一个日志轮换兄弟,它与
foo.log
无关,这就是为什么我尝试使用
[:digit:]
…它更接近。但是(1)有时日志旋转的同级不会被压缩,因此它们不会以
.gz
结尾。我应该在问题中提到这一点。包括
foo。[0-9]*
打开它以匹配
foo.0a
,这将是我代码中的一个bug。另外(2)原始文件将匹配
foo.0a.gz
,这在日志目录中是一个不太可能的文件名。用
[[:digit:][]
列出可能性处理了这一点,在我的例子中,这可能是值得的,但我处理的是一位和两位数字,而不是n位数字。(撇开日志旋转不谈,我仍然想知道是否有办法用glob处理1到n个数字。)回答你的问题,没有glob模式可以匹配一系列数字。我会使用glob来找到一组好的候选对象,如果需要进一步筛选,我会通过regex将这组候选对象传递给regex。这将是有效和灵活的。如果你在你的答案中包含这一点,我可以接受。我认为答案现在包含了我们的评论讨论。这不是POSIX按照OP的要求指定的。