代码之家  ›  专栏  ›  技术社区  ›  j-hap

检查文件是否不存在或比csh中的其他文件旧

  •  3
  • j-hap  · 技术社区  · 8 年前

    在C-shell中,我需要检查一个文件是否存在,或者它是否比另一个文件旧(或者在本例中,它比unix时间开始时的5秒长)。如果文件不存在或已旧,则应执行一些内容。

    在我的示例中,“bla.txt”不存在,因此第一个条件为真

    if ( ! -f bla.txt || `stat -c "%Y" bla.txt` > 5 ) echo 1
    stat: cannot stat `bla.txt': No such file or directory
    1
    

    问题是,如果我在if语句中组合这些条件,第二个条件(文件的年龄)将被执行,尽管第一个条件已经为真,并且由于文件不在那里而给出错误。

    在bash中,一切正常工作

    if [ ! -f bla.txt ] || [ `stat -c "%Y" bla.txt` > 5 ]; then echo 1; fi
    1
    

    关于如何在csh中实现这种行为的任何想法 else if ? 我不想在代码中执行两次命令。

    谢谢

    2 回复  |  直到 6 年前
        1
  •  3
  •   Community Ian Goodfellow    7 年前

    CSH有一个解析器,老实说,它不配得上这个名字。

    这个特定实例中的问题是,它在开始之前没有首先计算||构造的左侧 stat (如你所见)。由于您依赖于 斯达 您无法通过重定向输出 >& /dev/null 或者,只重定向stderr有点麻烦(请参见 Redirecting stderr in csh ).

    如果您想要仍然可以理解的干净csh代码,但不想对实际的代码调用进行两次编码,我认为最干净的解决方案是使用中间变量。大致如下:

    #!/bin/csh
    set f=$1
    set do=0
    if ( ! -f $f ) then
      set do=1
    else
      if ( `stat -c "%Y" $f >& /dev/null ` < 5 ) set do=1
    endif
    
    if ( $do ) echo "File $f does not exist or is older than 5s after epoch"
    

    (请注意,您的原始代码也有与您的散文相反的年龄测试。)

        2
  •  0
  •   Thomas Dickey    8 年前

    您可以移动 -f 在shell命令中进行测试,从该命令重定向 stat 。下面是一个脚本来说明:

    #!/bin/csh                                                                 
    set verbose
    set XX=/tmp/foo
    set YY=2
    rm -f $XX
    foreach ZZ ( 0 1 )
        if ( ` stat -c "%Y" $XX` > $YY ) echo 1
        if ( ` test -f $XX && stat -c "%Y" $XX` > $YY ) echo 1
        if ( $ZZ == 0 ) touch $XX
        stat -c "%Y" $XX
        sleep $YY
    end