find 选项和 -mtime +7*365 的不同结果

Posted

技术标签:

【中文标题】find 选项和 -mtime +7*365 的不同结果【英文标题】:Different results with find option and -mtime +7*365 【发布时间】:2019-10-24 15:13:24 【问题描述】:

我正在将一些脚本从 AIX 移动到 RHEL,并且找到了以下格式的 find 命令:

find -mtime +7*365

有没有人遇到过类似上面的语法?

将 7*365 替换为 2555 会得到不同的结果。是的,我无法追踪该脚本的原始创建者来亲自询问。

编辑: 我忘记了一个“+”号,抱歉。 我专注于 -mtime 值的乘法,但完整的命令是

find /path/ -mtime +7*365 -name 'SOME_NAME*.*'

【问题讨论】:

【参考方案1】:

首先,如果当前目录中存在名称以7 开头并以365 结尾的文件,则7*365 将替换为匹配文件的名称。为了保证find 看到7*365,需要保护通配符,例如find -mtime '7*365'find -mtime 7\*365

然后我从未见过接受算术表达式的 find 实现。只有十进制的非负整数(GNU find 也接受带有前导 0x 的十六进制),以及可选的前导 -+。 AIX man page 表示需要“十进制整数”(可选前导 -+)。我这里没有要测试的 AIX,但是使用 7*365,我预计会出现错误,或者如果整数解析器非常草率,它可能会被解析为 7 或 0。

要查找大约 7 年前修改过的文件,您需要告诉 shell 执行算术运算:find -mtime $((7*365))

您编写的确实工作的修改版本如下:

typeset -i interval
interval=7*365
find … -mtime "$interval"

它也可以在 interval 上不带引号(只要 IFS 不包含数字)。这样做的原因是typeset -iinterval 声明为整数变量。当您为interval 赋值时,shell 执行算术运算,因此interval 被设置为2555。这仅适用于 ksh 和 bash,不适用于普通 sh。

【讨论】:

GCC Compile Farm 提供对两台或三台 AIX 机器的访问。考虑到向项目和作者捐赠了多少时间,您可以考虑获得一个帐户。 在GCC119 上,这是运行 AIX 的 Power8,$ find -mtime 7*365 会导致 find: missing argument to `-mtime' find /path/ -mtime +7*365 -name 'SOME_NAME*.*' 在我要移动脚本的源系统上工作得很好 @kibicrealu1 还有超过 2555 天的文件吗?如果旧 AIX 版本有一个草率的解析器,其中 +7*365 被解析为 +7(列出超过 7 天的文件)或 +0(列出所有修改时间在过去的文件),我不会感到惊讶. @Gilles 它似乎和你写的完全一样,非常感谢! +7 & +7*365 返回相同的答案,那就是草率的解析器!

以上是关于find 选项和 -mtime +7*365 的不同结果的主要内容,如果未能解决你的问题,请参考以下文章

Clion / Cmake和Eigen出错

在 BATCH 中更改区域和语言选项

使用框架 4.7.2 运行 SDK 项目的 vs2019 中的控件和表单缺少图标和视图设计器选项

jquery ajax 选项卡和表格工具

Mysql启动选项和配置文件

结构和指针卡住