【问题标题】:Shell script date arithmeticsShell 脚本日期算术
【发布时间】:2011-07-21 11:10:31
【问题描述】:

这是我的高级问题。

我想从配置文件中读取一个数字max_age_in_secs。这个数字表示我们认为文件“旧”的秒数。读完这个配置后,我们想搜索data目录下的所有文件,并删除在max_age_in_secs秒前修改的所有文件。

这必须作为一个 shell 脚本来完成,更具体地说是 korn shell。

我现在正在做的是在max_age_in_secs 之前触摸要修改的虚拟文件,然后使用find 及其! -newer 选项来搜索比这更早的文件。

我在获取要传递给 touch 的时间戳时遇到问题。我的 unix 机器上的 date 命令没有 --date 选项,所以我不能使用它。

我正在查看perl -e "blah_blah_blah",但我需要将max_age_in_secs 变量传递给perl 命令。我知道这样做的唯一方法是创建一个新的.pl 文件并将参数传递给该文件。但理想情况下,我希望在一个 korn 脚本文件中具有此功能。一种解决方法可能是构造一个perl_command 变量并执行其内容,但我认为这不安全且容易受到注入。

但我对 shell 脚本和 perl 比较陌生,因此感谢任何帮助。

【问题讨论】:

    标签: perl shell ksh


    【解决方案1】:

    将环境变量从 shell 传递到单行 perl 命令的方法不止一种:

    • 直接。大多数 shell(包括 korn)在双引号内插入表达式。
    perl -e "打印 $VAR"
    

    所以在这种情况下$VAR 来自外壳。这种技术有很多缺点,即使用 `-e “双引号表达式”,使用其他 Perl 变量或使用许多其他可能被 shell 误解的有用 Perl 结构是很痛苦的。

    • 作为命令行参数,在@ARGV 中的 perl 脚本中访问
    perl -e 'print "VAR is $ARGV[0]"' $VAR
    

    如果您不需要使用@ARGV(如果您使用-p-n 开关,或者如果您的程序使用默认的<> 运算符,则会隐式使用)。

    p>
    • 通过 Perl 的 %ENV 哈希。
    perl -e 'print "VAR is $ENV{VAR}"'
    

    此机制不会干扰@ARGV

    【讨论】:

    • 如果您使用%ENV,请确保您使用export shell 变量。
    【解决方案2】:

    用分钟代替秒。 find 的最新版本具有 mmin 选项。例如,以下命令会删除超过一分钟的文件。

    find /path/ -type f -mmin +1 -exec rm {} \;
    

    【讨论】:

    • 如果服务器上的date命令没有--date,我假设find命令不会有-mmin...
    • @Jean,你是对的。我试过 -mmin 没有运气。感谢 dogban 的建议。
    【解决方案3】:
    perl -e '... $ENV{max_age_in_secs}...'
    

    只要你这样做

    export max_age_in_secs
    

    在 bash/sh/ksh 中

    【讨论】:

      猜你喜欢
      • 2011-03-02
      • 2010-09-26
      • 1970-01-01
      • 2019-12-16
      • 1970-01-01
      • 2010-09-05
      • 1970-01-01
      • 2020-02-13
      相关资源
      最近更新 更多