我想遍历
高兴的是,
我的原始尝试是
但是如何使用glob模式匹配任意数量的数字?(或者这不受支持吗?)我只知道如何显式地列出每个数字位数。例如,以下处理1位和2位数字并正确排除
寻找符合POSIX的解决方案...
编辑:logrotate conf会压缩某些文件,并且不会压缩其他文件。因此,并非所有兄弟都以
foo.log
和它的日志轮换兄弟foo.1.gz
和foo.2.gz
,从最新到最旧,使用不会被存在foo.bar
欺骗的代码。高兴的是,
logrotate
的命名使得最新到最旧和按字母排序是相同的顺序。我的原始尝试是
for f in $(ls -t foo.*) ; do ...
但shellcheck
说Iterating over ls output is fragile. Use globs. [SC2045]
。此外,这段代码匹配了不需要的foo.bar
。但是如何使用glob模式匹配任意数量的数字?(或者这不受支持吗?)我只知道如何显式地列出每个数字位数。例如,以下处理1位和2位数字并正确排除
foo.1bar.gz
,但无法处理foo.123.gz
(并且我没有做正确的事情来引起glob
匹配!)
for f in foo.log foo.[[:digit:]].gz foo.[[:digit:]][[:digit:]].gz; do ...
我可以假设没有人保留100个以上的日志轮换兄弟,但我不想这样做。寻找符合POSIX的解决方案...
编辑:logrotate conf会压缩某些文件,并且不会压缩其他文件。因此,并非所有兄弟都以
.gz
结尾。
foo.*.gz
匹配了foo.bar.log.1.gz
,这是foo.bar.log
的第一个被旋转的日志,与foo.log
无关,这就是我尝试使用[[:digit:]]
的原因… - user1011471.gz
结尾。我应该在问题中提到这一点作为可能性。包括foo.[0-9]*
打开了匹配foo.0a
的可能性,这将是我的代码中的一个错误。此外,(2)原始文件名会匹配foo.0a.gz
,这在日志目录中显然是一个不太可能的文件名。使用[[:digit:]]
列出可能性可以处理这个问题,在我的情况下可能值得这样做,但这样我处理的是一位数字和两位数字,而不是n位数字。(撇开日志轮换不谈,我仍然想知道是否有一种方法来处理从1到n位数字的glob匹配。) - user1011471