我想更改files中的文件名后缀(使用bash脚本),但有时有些文件有一个句点,有些文件有两个句点。
现在我用这个:
new_file=`echo ${file} | sed 's/\(.*\.log.*\)'${suf}'/\1.'${num}'/'`
其中,“new_file”是新文件名,“file”是原始文件名,“${suf}”是文件后缀,${num}是新编号。
因此,some.log 必须变为 some.log.1,some.log.1 必须变为 some.log.2。在我的代码中,some.log 变为 some.log.1,但 some.log.1 仍然是 some.log.1。
我希望我说得够清楚了,我很感激任何建议(即使不使用sed)。
更新日期:
@paxdiablo.我想测试时出了问题。
现在我使用这段代码作为测试;
#!/usr/bin/bash
shft() {
for suff in {6..1} ; do
if [[ -f "$1.${suff}" ]] ; then
((nxt = suff + 1))
echo Moving "$1.${suff}" to "$1.${nxt}"
mv -f "$1.${suff}" "$1.${nxt}"
fi
done
echo Moving "$1" to "$1.1"
mv -f "$1" "$1.1"
}
clear
folder=~/logs/*.log
for i in {1..20}; do
echo ${i}> ~/logs/some.log
for fspec in ${folder} ; do
shft "${fspec}"
done
done
现在一切都很好,抱歉让你误会了。
2条答案
按热度按时间amrnrhlw1#
如果您希望滚动日志文件,并且根据您需要的复杂程度,我以前使用过以下代码段:
这将自动将日志文件更新到版本9,尽管您可以更改
suff
for
循环以允许更多版本。添加了
DEBUG
之后,系统会自动创建新文件以进行测试,下面的脚本显示了它的运行情况:这个脚本的优点是可以很容易地配置它来处理大量的历史记录(通过更改
{8..1}
位),处理带有空格的名称,并在日志文件丢失时相对健壮地处理间隙。izj3ouym2#
要旋转日志,实际上应该使用logrotate。
如果你不能保证logrotate可用,这里有一个方法在shell中实现.为了简单起见,我假设在你的脚本运行时,没有其他东西(包括你的脚本的另一个示例)会尝试重命名日志文件.
最简单的方法是在将日志N重命名为N+1之前递归地重命名日志N+1。shell可以执行所有必要的运算,这里不需要
sed
。注意,尽管POSIX shell中可以使用递归函数,但除了位置参数之外没有其他局部变量(许多shell提供局部变量作为扩展)。关于您所写的内容,请注意
echo ${file}
之所以不好有两个原因:最重要的是,如果${file}
包含任何特殊字符(如白色),shell将解释它们;而且,对于某些shell,echo
本身会解释反斜杠和可能的前导-
,所以你应该写printf %s "$file"
。