gpt4 book ai didi

shell - 检查文件是否不存在或比 csh 中的另一个文件旧

转载 作者:行者123 更新时间:2023-12-01 13:47:41 26 4
gpt4 key购买 nike

在 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

关于如何在没有 else if 的情况下在 csh 中实现此行为的任何想法?我不想让命令在我的代码中执行两次。

谢谢!

最佳答案

CSH 有一个解析器,老实说,它名不副实。

此特定实例中的问题是它不计算 || 的左侧在开始 stat 之前首先构造(如您所见)。由于您依赖于 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"

(请注意,您的原始代码还对您的散文进行了年龄测试。)

关于shell - 检查文件是否不存在或比 csh 中的另一个文件旧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34628524/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com