如何比较同一个文件的两个统计值?

时间:2017-09-07 12:40:11

标签: linux shell unix terminal

Screenshot of the my code

我正在尝试创建一个shell程序,它告诉我何时创建了文件,何时修改了文件以及何时删除了该文件。我想我可以解决这个问题,但我唯一的问题是我无法比较统计值。它告诉我,我有“太多的论点”。任何帮助将不胜感激:))

#!/bin/bash

run=yes

if [ -f $1 ]
then

    while [ run=yes ]
    do

        time1=$(stat -c %y $1)

        time2=$(stat -c %y $1)

        if [ ! $time2 ]
        then
            echo "The file "$1" has been deleted."
            run=no

        elif [ $time2 -gt $time1 ]
        then
            echo "The file "$1" has been modified."
            run=no
fi
done

else
    while [ run=yes ]
    do
    sleep 2

        if [ -f $1 ]
        then
        echo "The file "$1" has been created."
        run=no
fi
done
fi

2 个答案:

答案 0 :(得分:0)

static -c %y ...的输出包括空格,这是shell用来分隔参数的内容。然后运行:

if [ ! $time2 ]; then

这转化为:

if [ ! 2017-09-02 08:57:19.449051182 -0400 ]; then

哪个错误。 !运算符只需要一个参数。你可以用引号解决它:

if [ ! "$time2" ]; then

或者使用特定于bash的[[...]]]条件:

if [[ ! $time2 ]]; then

(有关第二个解决方案的详细信息,请参阅bash(1)手册页。)

另外,您无法将时间与-gt进行比较,如下所示:

    elif [ $time2 -gt $time1 ]

这个(a)与早期的if语句有同样的问题,而(b)-gt只能用来比较整数,而不是时间字符串。

如果您使用%Y代替%y,您将获得自纪元以来整数秒的时间,这将解决所有上述问题。

答案 1 :(得分:0)

代码现在正在运行,我想如果有人想知道我会分享最终结果。

#!/bin/bash

run=true

if [ -f $1 ]
then

while [ "$run" = true ]
do

    time1=$(stat -c %Y $1 2>/dev/null)
    sleep $2
    time2=$(stat -c %Y $1 2>/dev/null)

    if [ ! "$time2" ]
    then
        echo "The file "$1" has been deleted."
        run=false

    elif [ $time2 -gt $time1 ]
    then
        echo "The file "$1" has been modified."
        run=false
fi

else
while [ "$run" = true ]
do
sleep 2

    if [ -f $1 ]
    then
    echo "The file "$1" has been created."
    run=false
fi
done
fi