我正在开发UNIX任务,我想检查目录中是否存在特定的日志文件。如果它存在,我想通过在结尾附加时间戳来重命名它。文件名的格式如下:ServiceFileName_0.log
这是我到目前为止所做的,但是当我运行脚本时它不会重命名,即使存在名为ServiceFileName_0.log的文件存在。
renameLogs()
{
#If a ServiceFileName log exists, rename it
if [ -f $MY_DIR/logs/ServiceFileName_0.log ];
then
mv ServiceFileName_0.log ServiceFileName_0.log.%M%H%S
fi
}
请帮助!
由于
答案 0 :(得分:3)
您可能需要在文件名前加$MY_DIR
路径,就像在测试中一样。
答案 1 :(得分:1)
renameLogs()
{
if [ -f $MY_DIR/logs/ServiceFileName_0.log ]
then mv $MY_DIR/ServiceFileName_0.log $MY_DIR/ServiceFileName_0.log.$(date +%M%H%S)
fi
}
始终使用目录前缀。您还需要正确指定时间,如图所示。
更好,但重复次数更少:
renameLogs()
{
logfile="$MY_DIR/logs/ServiceFileName_0.log"
if [ -f "$logfile" ]
then mv "$logfile" "$logfile.$(date +%H%M%S)"
fi
}
注意:我已经将MMHHSS的格式重新排序为更传统的HHMMSS订单。如果您也使用日期组件,则应认真考虑使用ISO 8601推荐的顺序,即[YYYY] mmdd。它在ls
列表中将所有日志文件组合在一起一个月,这通常很有帮助。使用ddmm顺序意味着每个月的第一个文件被组合在一起,然后是每个月的第二个文件,等等。这通常不太理想。
答案 2 :(得分:0)
您可以替换它:
mv ServiceFileName_0.log ServiceFileName_0.log.%M%H%S
用这个
mv $MY_DIR/logs/ServiceFileName_0.log $MY_DIR/logs/ServiceFileName_0.log.%M%H%S
答案 3 :(得分:0)
这不是你明显的直接问题,但是if
构造是错误的:它引入了time-of-check to time-of-use race condition。 在 if [ -f
检查和mv
之间,可能会出现其他一些进程并更改内容,因此即使检查成功,也无法再移动文件。
要避免这类错误,请始终通过尝试您要执行的操作来编写启动的代码,然后如果失败,请找出原因。在这种情况下,如果源文件不存在,您想要的是什么都不做,但如果操作因任何其他原因而失败,则报告错误。在便携式shell中没有好办法,你需要能够检查errno
的东西。我可能会写这个C助手:
#include <stdio.h>
#include <errno.h>
#include <string.h>
int main(int argc, char **argv)
{
if (argc != 3) {
fprintf(stderr, "usage: %s source destination\n", argv[0]);
return 2;
}
if (rename(argv[1], argv[2]) && errno != ENOENT) {
fprintf(stderr, "rename '%s' to '%s': %s\n",
argv[1], argv[2], strerror(errno));
return 1;
}
return 0;
}
然后像这样使用它:
renameLogs()
{
( cd "$MY_DIR/logs"
rename_if_exists ServiceFileName_0.log ServiceFileName_0.log.$(date +%M%H%S)
)
}
( cd
构造修复了您的直接问题,与其他建议不同,避免了另一个种族,其中一些其他进程出现并与logs
目录或其混淆父目录。
强制shell脚本编写附录:始终将变量扩展用双引号括起来,除非在希望扩展需要进行单词拆分的极少数情况下。