Unix如果文件存在,请重命名

时间:2012-03-19 16:29:21

标签: unix timestamp rename

我正在开发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
}

请帮助!

由于

4 个答案:

答案 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脚本编写附录:始终将变量扩展用双引号括起来,除非在希望扩展需要进行单词拆分的极少数情况下。