Shell脚本日期算术

时间:2011-03-23 16:11:56

标签: perl shell ksh

这是我的高级问题。

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

这必须以shell脚本完成,更具体地说是korn shell。

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

我在将时间戳传递给touch时遇到问题。我的unix框上的date命令没有--date选项,所以我无法使用它。

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

但我对shell脚本和perl相对较新,所以感谢任何帮助。

3 个答案:

答案 0 :(得分:2)

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

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

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

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

如果您不需要使用@ARGV(如果您使用-p-n开关时隐式使用,或者您的程序使用默认值{{}},则会执行此操作1}} operator)。

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

此机制不会干扰%ENV

答案 1 :(得分:1)

perl -e '... $ENV{max_age_in_secs}...'

只要你做

export max_age_in_secs

在bash / sh / ksh中

答案 2 :(得分:0)

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

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