我希望迭代foo.log
及其日志旋转的兄弟foo.1.gz
和foo.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 ...
结束。
答案 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
祝你好运!