【问题标题】:How to select files that were added to a directory in the past 5 mins - HP-UX如何选择在过去 5 分钟内添加到目录的文件 - HP-UX
【发布时间】:2015-04-17 07:43:12
【问题描述】:

我需要选择过去 5 分钟内添加到特定目录的所有文件并将它们复制到不同的目录。我正在使用不支持 amin、cmin 和 mmin 的 HP-UX 操作系统。 B/c,我正在创建一个临时文件,并将使用 find -newer 命令将文件与更改时间戳(5 分钟前)的临时文件进行比较。 HP-UX 不支持 'touch' 命令的 -d 选项,所以我不能这样做:

touch -d "5 mins ago" temp

我尝试使用以下解决方案,但在使用时收到错误(非法变量名):

TZ=ZZZ0 touch -t "$(TZ=ZZZ0:5 date +%Y%m%d%H%M.%S)" temp

问:有谁知道如何选择过去 5 分钟内添加到目录中的文件,而无需操作时间标签(分钟、天、月……)? p>

注意:我的脚本将每 5 分钟运行一次,但我需要将解决方案包含在脚本中(即,不取决于它每 5 分钟运行一次的事实)。我无法对时间戳进行硬编码。

谢谢,

马特

【问题讨论】:

  • 脚本8分钟没有运行,你还只想要5分钟吗?要获取“未复制”文件,请查找最后复制的文件,然后搜索比该文件更新的文件。否则,您需要调用一个脚本来计算 5 分钟前的时间戳并将其用于触摸。
  • 解决方案不符合您的注释:每 5 分钟创建一个 crontab 条目触摸一个文件/使用触摸临时完成您的脚本(由 cron 启动?)。也许改变你的要求?
  • 您不需要使用touch -d。只需使用以下逻辑:1)触摸temp2 2)睡眠至少1 秒,因为这是find 的粒度。 3) 找到所有比temp 更新的文件并处理它们 4) mv temp2 temp 5) 睡多久就睡多久,然后转到 1)。
  • 如果您通过每 5 分钟运行一个全新进程而不是休眠 5 分钟来实现它,请不要执行休眠的最后一步。但是您还需要考虑处理所有文件需要超过 5 分钟的时间。您不希望同时运行多个脚本实例。可能需要使用某种锁定。
  • 我正在寻找一个很长的脚本,我在某个地方找到了支持各种日期/时间计算的脚本。现在我发现了一些听起来很简单的东西:blog.fpmurphy.com/2008/10/ksh93-date-manipulation.html 这对你有用吗?

标签: bash shell unix ksh hp-ux


【解决方案1】:

当您的脚本设计为每 5 分钟运行一次时,下一个解决方案可能会起作用:

#!/bin/ksh
TMPFILE=/tmp/$0.$$
touch ${TMPFILE}
sleep 300
find somedir -newer ${TMPFILE} | while read file; do
   something_with_file ${file}
done
rm ${TMPFILE}

您的 something_with_file 应该在 5 分钟内完成,您不希望脚本的不同执行处理同一个文件。
5 分钟的延迟应该不是问题,因为您每 5 分钟启动一次。

【讨论】:

    【解决方案2】:

    通过使用以下代码块,我能够获得所需的功能:

    # Fill date variables 
    date '+%Y %m %d %H %M %S' | read in_Y in_m in_d in_H in_M in_S
    
    # Decrease month count to account for first month being at index 0
    ((in_m=$in_m-1)) 
    
    # Get current time in seconds since epoch
    perl -e "use Time::Local; print timelocal($in_S,$in_M,$in_H,$in_d,$in_m,$in_Y), ;" | read cur_S
    
    # Go back five minutes
    ((old_S=$cur_S-300))
    
    # Change to required format
    perl -e 'use POSIX qw(strftime);\
    print scalar(strftime "%Y %m %d %H %M %S", localtime $ARGV[0]), "\n";' $old_S | read Y m d H M S
    
    # Create temp file to act as time reference
    touch -amt ${Y}${m}${d}${H}${M}.${S} ${tempFileDest}
    
    cd $testSourceDir
    
    # Find files created in past five minutes
    find . -type f -newer temp -name $fileNameFormatTest -exec cp -pf {} $testDestDir \;
    

    感谢您的帮助!

    【讨论】:

    • 嗨,马特。考虑到我对perl 编程的了解不够,是否可以减少脚本的第一行,前提是perl 可以像cur_S-300 一样计算简单的算术运算?
    猜你喜欢
    • 2013-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-20
    • 2011-11-18
    相关资源
    最近更新 更多