比较awk中的时间

时间:2010-02-18 09:49:52

标签: awk

我想检查一个目录中所有文件的修改时间。如果任何文件的时间与当前系统时间不同,则将打印RED。否则,打印绿色。

ls -lrt| grep main | awk '{if ($8 != `date +%R` ) print "-->RED"}END{print"-->GREEN"}' 

您可以建议我如何纠正上述陈述。百万谢谢。

2 个答案:

答案 0 :(得分:2)

Don't parse the output of ls。您可以使用stat执行所需操作。

自1970年1月1日起,

stat -c%Y file将以秒为单位输出文件的修改时间。date +%s将输出自1970年1月1日以来以秒为单位的当前时间。

所以,你想要的是:

if [[ $(stat -c%Y main) -ne $(date +%s) ]]
then
    echo "RED"
else
    echo "GREEN"
fi

如果你想要上面的文件列表,并输出RED,如果有任何不同的时间:

to_print=GREEN
for f in *main*
do
    if [[ $(stat -c%Y "$f") -ne $(date +%s) ]]
    then
        to_print=RED
        break
    fi
done
echo $to_print

如果您不使用bash,则可以将[[ ]]对替换为[],将$(...)替换为

`...`

答案 1 :(得分:1)

这是使用shell和date命令

执行此操作的一种方法
#!/bin/bash
current=$(date +%R)
for file in *main*
do
    d=$(date +%R -r "$file")
    if [ "$d" = "$current" ];then
        echo "GREEN: $file, current:$current, d: $d"
    else
        echo "RED: $file, current: $current, d: $d"
    fi
done

请注意,您必须根据自己的需要进行调整,因为您可能只想比较日期,或仅限时间等等。无论是什么,请查看各种日期格式的日期手册页。

如果你想用awk做这个,这是一个纯awk(+ GNU日期)解决方案

awk 'BEGIN{
    cmd="date +%R"
    cmd|getline current
    close(cmd)
    for(i=1;i<=ARGC;i++){
        file=ARGV[i]
        if(file!=""){
            cmd="date +%R -r \047"file"\047"
            cmd |getline filetime
            close(cmd)
            if( filetime==current){
                print "GREEN: "file
            }else{
                print "RED: "file
            }
        }
    }
}
' *