【问题标题】:how to use shell script checking last changed time of a file如何使用shell脚本检查文件的最后更改时间
【发布时间】:2009-07-30 14:40:48
【问题描述】:

我想查看某些文件是否在最后三分钟内发生更改,以确定cp 是否成功,以及是否应该exit 或继续执行脚本。我该怎么做?

谢谢

【问题讨论】:

    标签: file datetime shell copy


    【解决方案1】:

    stat 可以获取文件的最后修改时间,date 可以获取当前日期。您可以使用格式字符串在“自纪元以来的秒数”内获取它们:

    current=`date +%s`
    last_modified=`stat -c "%Y" $file`
    

    然后,很容易将其置于条件中。例如:

    if [ $(($current-$last_modified)) -gt 180 ]; then 
         echo "old"; 
    else 
         echo "new"; 
    fi
    

    【讨论】:

    • stat -c %Y 的支持范围有多广?在 OS X 上,我会使用 stat -f %m,但在某些 Linux 风格上,stat -f 会显示文件系统信息。大多数系统都支持date -r "$file" +%s,但尴尬的是在 OS X 上不起作用……有趣的东西 :)
    • “if 条件”中的 180 是什么?是几秒还是几天?
    【解决方案2】:

    这个 if 语句的语法取决于你的特定 shell,但 date 命令不。我使用 bash;根据需要进行修改。

    if [ $(( $(date +%s) - $(date +%s -r <file>) )) -le 180 ]; then
        # was modified in last three minutes
    else
        # was not modified in last three minutes
    fi
    

    +%s 告诉 date 输出一个 UNIX 时间(重要的是它是以秒为单位的整数)。您还可以使用 stat 获取此信息 - 命令 stat -c %Y &lt;file&gt; 是等效的。确保使用%Y 而不是%y,以便获得以秒为单位的可用时间。

    【讨论】:

      【解决方案3】:

      stat命令会给你最后修改时间

      stat -c %y <filename>
      

      【讨论】:

        【解决方案4】:

        Find 可以输出最近 3 分钟内修改过的文件名。

        find file1 -maxdepth 0 -mmin -3
        

        【讨论】:

        • 如果您想在脚本中添加它作为测试,您可以使用:if [ -n "$(find etc...)" ]; then...
        【解决方案5】:

        文件时间戳更改并不真正意味着您已成功复制。
        如果您损坏文件或文件系统空间不足,
        您可能仍会看到时间戳更改(需要确认)。

        我没有得到您要求的确切背景。
        如果您触发 cp,它会完成并返回——在它工作时不会返回。
        那么,返回(带有成功退出代码)不是成功的良好指标吗?

        如何以及为什么要在 cp 操作中部分退出?
        或者,是循环文件列表的批处理cp 脚本...
        一些详细说明会有所帮助。

        【讨论】:

        • cp 在一个脚本中完成,验证在另一个脚本中完成。所以存在不会中途停止cp。顺便问一下,我怎样才能得到验证cp的存在代码?谢谢
        猜你喜欢
        • 1970-01-01
        • 2015-11-22
        • 2017-03-23
        • 1970-01-01
        • 2019-11-06
        • 1970-01-01
        • 1970-01-01
        • 2012-03-24
        • 1970-01-01
        相关资源
        最近更新 更多