为什么 logrotate 的文件名通配符不会拾取名称中带有空格的文件?

为什么 logrotate 的文件名通配符不会拾取名称中带有空格的文件?

如果我指定*bar* {}logrotate 将匹配foo-bar.log但不匹配foo bar.log

据我所知,logrotate 的通配符应该表现得像 shell 通配符,因此为了测试,我运行了ls *bar*。但是,这会打印出foo-bar.log foo bar.log所以我不相信他们使用相同的全局匹配算法。

如何编写一个 logrotate 通配符 glob 来匹配名称中带有空格的文件?

$ logrotate -v
logrotate 3.8.7 - Copyright (C) 1995-2001 Red Hat, Inc.

答案1

Eric Renouf 的说法是正确的。文件名中的空格必然会给您带来问题,如果您不在代码中考虑到这一点或更改使用文件名的方式,那么您将给自己带来更多麻烦。

关于为什么这是一个坏主意的更详细解释是这里

话虽如此,如果你读过男人您将logrotate在第三段中看到,

请注意,本节开头第一个文件名周围的双引号允许 logrotate 轮换名称中带有空格的日志。

您似乎知道这一部分,但您还需要做的是考虑文件名中的空格。

手册页中的下一句话是,

应用正常的 shell 引用规则,支持 '、" 和 \ 字符。

因此,您必须像使用引号一样转义空格,但通配符会导致问题。要使通配符起作用,它必须位于引号之外。

有关如何执行此操作的示例,请参阅Unix 和 Linux

由于您对日志文件有自定义的命名约定,我假设您知道文件名中空格之前的部分。

所以你可以创建一个数组

files=( /dir/subdir/filename\ morefilename*.log )

然后运行 ​​log rotate 并告知文件是“${files[@]}”。

如果您有其他名称中没有空格的日志文件,请重复此过程。

您可以看到为什么在编写脚本时在文件名中使用通配符是一个非常糟糕的主意。

请对转义特殊字符进行一些研究,并务必阅读手册。

相关内容