如何在/ bin / sh中编写脚本以确定文件是否超过30分钟?
不幸的是,系统中不存在统计数据。这是一个旧的Unix系统,http://en.wikipedia.org/wiki/Interactive_Unix
很遗憾,Perl没有安装在系统上,客户也不想安装它,也没有其他任何东西。
答案 0 :(得分:65)
这是使用find
的一种方式。
if test "`find file -mmin +30`"
如果相关文件包含空格或特殊字符,则必须引用find
命令。
答案 1 :(得分:27)
以下为您提供以秒为单位的文件年龄:
echo $(( `date +%s` - `stat -L --format %Y $filename` ))
这意味着对于超过30分钟的文件,这应该给出一个真/假值(1/0):
echo $(( (`date +%s` - `stat -L --format %Y $filename`) > (30*60) ))
30*60
- 一分钟内60秒,不要预先计算,让CPU为你完成工作!
答案 2 :(得分:16)
如果你正在写一个sh脚本,最有用的方法是使用test
和已经提到的统计技巧:
if [ `stat --format=%Y $file` -le $(( `date +%s` - 1800 )) ]; then
do stuff with your 30-minutes-old $file
fi
请注意,[
是test
的符号链接(或其他等效符号);请参阅man test
,但请注意test
和[
也是bash内置因素,因此可能会略有不同的行为。 (另请注意[[
bash复合命令。)
答案 3 :(得分:9)
好的,没有统计数字和残缺的发现。这是您的替代方案:
编译GNU coreutils以获得合适的查找(以及许多其他方便的命令)。你可能已经把它作为gfind了。
如果date
有效,您可以使用-r
来获取文件修改时间吗?
(`date +%s` - `date -r $file +%s`) > (30*60)
或者,使用-nt
比较来选择哪个文件更新,麻烦是在过去30分钟制作一个mod时间的文件。 touch
通常可以做到这一点,但所有投注都是关于可用的投注。
touch -d '30 minutes ago' 30_minutes_ago
if [ your_file -ot 30_minutes_ago ]; then
...do stuff...
fi
最后,看看Perl是否可用而不是挣扎于谁知道shell实用程序的版本。
use File::stat;
print "Yes" if (time - stat("yourfile")->mtime) > 60*30;
答案 4 :(得分:5)
对于像我这样的人,根据@slebetman的回答,他们不喜欢背蜱:
echo $(( $(date +%s) - $(stat -L --format %Y $filename) > (30*60) ))
答案 5 :(得分:4)
您可以通过与使用30分钟前的时间戳创建的参考文件进行比较来完成此操作。
首先输入
创建比较文件touch -t YYYYMMDDhhmm.ss /tmp/thirty_minutes_ago
用30分钟前的值替换时间戳。您可以使用Perl中的一个简单的一个线程来自动执行此步骤。
然后使用find的较新运算符通过否定搜索运算符来匹配较旧的文件
find . \! -newer /tmp/thirty_minutes_ago -print
答案 6 :(得分:2)
超过30分钟:超过30分钟修改,或超过30分钟前创建是什么意思?希望它是前者,因为到目前为止的答案对于这种解释是正确的。在后一种情况下,由于unix文件系统不跟踪文件的创建时间,因此存在问题。 (ctime
文件属性记录上次更改 inode 内容时,即发生chmod
或chown
之类的内容。
如果你真的需要知道文件是否是在30多分钟前创建的,你要么必须用find
重复扫描文件系统的相关部分,要么使用像linux这样的平台依赖的东西。 inotify
答案 7 :(得分:2)
#!/usr/bin/ksh
## this script creates a new timer file every minute and renames all the previously created timer files and then executes whatever script you need which can now use the timer files to compare against with a find. The script is designed to always be running on the server. The first time the script is executed it will remove the timer files and it will take an hour to rebuild them (assuming you want 60 minutes of timer files)
set -x
# if the server is rebooted for any reason or this scripts stops we must rebuild the timer files from scratch
find /yourpath/timer -type f -exec rm {} \;
while [ 1 ]
do
COUNTER=60
COUNTER2=60
cd /yourpath/timer
while [ COUNTER -gt 1 ]
do
COUNTER2=`expr $COUNTER - 1`
echo COUNTER=$COUNTER
echo COUNTER2=$COUNTER2
if [ -f timer-minutes-$COUNTER2 ]
then
mv timer-minutes-$COUNTER2 timer-minutes-$COUNTER
COUNTER=`expr $COUNTER - 1`
else
touch timer-minutes-$COUNTER2
fi
done
touch timer-minutes-1
sleep 60
#this will check to see if the files have been fully updated after a server restart
COUNT=`find . ! -newer timer-minutes-30 -type f | wc -l | awk '{print $1}'`
if [ $COUNT -eq 1 ]
then
# execute whatever scripts at this point
fi
done
答案 8 :(得分:2)
答案 9 :(得分:0)
if [[ "$(date --rfc-3339=ns -r /tmp/targetFile)" < "$(date --rfc-3339=ns --date '90 minutes ago')" ]] ; then echo "older"; fi
答案 10 :(得分:0)
以下是find
的变体:
if [ `find cache/nodes.csv -mmin +10 | egrep '.*'` ]
查找始终返回状态代码0
,除非它失败;但是,egrep
返回1
找不到匹配项。因此,如果该文件超过10分钟,则会通过此组合。
试一试:
touch /tmp/foo; sleep 61;
find /tmp/foo -mmin +1 | egrep '.*'; echo $?
find /tmp/foo -mmin +10 | egrep '.*'; echo $?
应该在文件路径后打印0然后再打印1。
我的功能使用:
## Usage: if isFileOlderThanMinutes "$NODES_FILE_RAW" $NODES_INFO_EXPIRY; then ...
function isFileOlderThanMinutes {
if [ "" == "$1" ] ; then serr "isFileOlderThanMinutes() usage: isFileOlderThanMinutes <file> <minutes>"; exit; fi
if [ "" == "$2" ] ; then serr "isFileOlderThanMinutes() usage: isFileOlderThanMinutes <file> <minutes>"; exit; fi
## Does not exist -> "older"
if [ ! -f "$1" ] ; then return 0; fi
## The file older than $2 is found...
find "$1" -mmin +$2 | egrep '.*' > /dev/null 2>&1;
if [ $? == 0 ] ; then return 0; fi ## So it is older.
return 1; ## Else it not older.
}
答案 11 :(得分:0)
当前时间与 myfile.txt 的上次修改时间之间的差异(以秒为单位):
echo $(($(date +%s)-$(stat -c "%Y" myfile.txt)))
您还可以将%X
或%Z
与命令stat -c
一起使用,以获取上次访问或上次状态更改之间的差异,请检查0返回!
%X time of last access, seconds since Epoch
%Y time of last data modification, seconds since Epoch
%Z time of last status change, seconds since Epoch
测试:
if [ $(($(date +%s)-$(stat -c "%Y" myfile.txt))) -lt 600 ] ; then echo younger than 600 sec ; else echo older than 600 sec ; fi