代码之家  ›  专栏  ›  技术社区  ›  Rob Wells

确定shell脚本中文件的使用期限

  •  10
  • Rob Wells  · 技术社区  · 16 年前

    我需要查看一个特定的文件是否有超过58分钟的sh shell脚本。我说的是带有POSIX扩展的Solaris shell。

    我想做一个实验

    touch -t YYYYMMDDHHmm.SS /var/tmp/toto
    

    时间戳是58分钟前,然后执行

    find ./logs_dir \! -newer /var/tmp/toto -print
    

    我们需要对使用镜像从不同服务器检索到的一些日志文件进行后处理。等待文件稳定是该团队决定镜像是否完成的方式,因此当天的日志现在已完成并准备好处理。

    感谢您的建议。

    干杯

    6 回复  |  直到 16 年前
        1
  •  20
  •   Erik van Oosten    9 年前

    我需要一些东西来测试一个特定文件的年龄,以避免经常重新下载。所以使用 GNU date bash

    # if file's modtime hour is less than current hour:
    [[ $(date +%k -r GPW/mstall.zip) -lt $(date +%k) ]] && \
    wget -S -N \
    http://bossa.pl/pub/metastock/mstock/mstall.zip \
    

    [[ $(date +%s -r mstall.zip) -lt $(date +%s --date="77 min ago") ]] && echo File is older than 1hr 17min
    

    BSD变体(在Mac上测试)为:

    [[ $(stat -f "%m" mstall.zip) -lt $(date -j -v-77M +%s) ]] && echo File is older than 1hr 17min
    
        2
  •  11
  •   alxp    16 年前

    find . -mtime +0h55m
    

    将返回任何修改日期早于55分钟的文件。

        3
  •  4
  •   HMM    16 年前

    拼图的一部分可能正在使用 stat . 你可以通过 -r -s

    find . -print -exec stat -r '{}' \;
    

        4
  •  4
  •   Brian C    12 年前

    这是一个老问题,对不起,但为了其他人寻找一个好的解决办法,因为我是。。。

    我能想到的最好的方法就是使用 find(1)

    if [ "$(find $file -mmin +58)" != "" ]
    then
      ... regenerate the file ...
    fi
    

    另一个选择是使用 stat(1) 命令以秒为单位返回文件的时间,日期命令以秒为单位返回现在的时间。结合bash shell数学运算符,计算文件的年龄变得非常简单:

    age=$(stat -c %Y $file)
    now=$(date +"%s")
    if (( (now - age) > (58 * 60) ))
    then
        ... regenerate the file ...
    fi
    

    您可以在不使用这两个变量的情况下执行上述操作,但它们使事情变得更清楚,bash math的使用也可以被替换。多年来,我在脚本中广泛使用了find(1)方法,除非您需要以秒为单位了解年龄,否则我建议您使用find(1)方法。

        5
  •  1
  •   Aaron Maenpaa    16 年前

    因为你想测试一个 具体的 您可以使用 test 并将其与专门创建的文件进行比较:

    test /path/to/file -nt /var/tmp/toto
    

    或:

    touch -t YYYYMMDDHHmm.SS /var/tmp/toto
    if [/path/to/file -nt /var/tmp/toto]
       ...
    
        6
  •  0
  •   Hogan    11 年前

    您也可以使用ls和awk来获取所需的内容。Awk有一个c-ish printf,允许您以任何方式格式化列。

    我在linux上的bash和solaris上的ksh中对此进行了测试。

    摆弄选项,为您的应用程序获取最佳值。特别是bash中的“-全职”和ksh中的“-E”。

    猛击

    ls -l foo | awk '{printf "%3s %1s\n", $6, $7}'

    ls --full-time foo | awk '{printf "%3s %1s\n", $6, $7}'

    ksh

    ls -l bar | awk '{printf "%3s %1s %s\n", $6, $7, $8}'

    5月3日11:19

    ls -E bar | awk '{printf "%3s %1s %s\n", $6, $7, $8}'

    2011-05-03 11:19:23.723044000 -0400