123、【OS】【Nuttx】【周边】效果呈现方案解析:find 格式化打印
【声明】本博客所有内容均为个人业余时间创作,所述技术案例均来自公开开源项目(如Github,Apache基金会),不涉及任何企业机密或未公开技术,如有侵权请联系删除
背景
之前 blog
【OS】【Nuttx】【周边】效果呈现方案解析:find 命令格式(上)
【OS】【Nuttx】【周边】效果呈现方案解析:find 命令格式(下)
分析了 find 命令格式的一些细节,下面继续分析这条命令
local file_mtime=$(find "$dir" -name "*.html" -type f -printf '%T@' 2>/dev/null | sort -n | tail -1)
有了之前的基础,再回过头看这条命令,就比较清晰了
首先,“$dir” 作为 starting-point,传入 find 命令作为搜索路径,当然这里 starting-point 可以是多个
然后后面紧跟着多个表达式,并且这些表达式没有显示使用逻辑与 -a 和逻辑或 -o,那就默认是逻辑与 -a,只有当前面表达式都为 true 时,才能执行后面下一个表达式
下面是第一个表达式
-name "*.html"
之前 blog 说过,双引号会抑制 Shell 展开通配符,那么此时 *.html 将完整传递给 -name 选项,而 -name 选项支持通配符匹配,可以自行匹配到搜索路径下的 .html 后缀的文件或目录
当匹配到 .html 后缀的文件或目录时,第一个表达式值为 true,与操作会进而判断下一个表达式
-type f
该表达式会进而判断匹配的 .html 后缀的是不是文件,如果是目录,该表达式值为 false,会继续判断下一个文件(目录),如果是文件,就进入下一个表达式判断
下一个表达式为
-printf '%T@'
格式化打印
下面详细分析下这个格式化打印表达式
首先 Bash 终端输入
man find
通过 /-print 查找,首先下面第一个关键点
这里有两个点
- 如果没有指定搜索路径,那么默认搜索当前目录,这也是之前 blog 反复分析过的
- 如果没有指定表达式,那么 -print 表达式将会被使用,这也是之前分析过的,比如直接在终端里面输入 find 命令,后面不接任何东西,那就会直接打印当前目录下能递归找到的所有东西(包括文件和目录)
下面是 find 命令手册里面另一个也很关键的点
这里有两个点值得注意:
- 可以看到不管是 -print,-print0 还是 -printf,第一个描述都是 True,这代表执行了这个表达式,一定会是 True 结果,用来给后面逻辑与 -a 和逻辑或 -o 提供判断依据
- 如果查找的文件名里面可能包含换行符,则应该考虑使用 -print0 来替代 -print,这个点也是之前 blog
【OS】【Nuttx】【周边】效果呈现方案解析:-print0 选项
【OS】【Nuttx】【周边】效果呈现方案解析:-print0 补充(上)
【OS】【Nuttx】【周边】效果呈现方案解析:-print0 补充(中)
【OS】【Nuttx】【周边】效果呈现方案解析:-print0 补充(下)
里面介绍过的
然后是 -printf 里面的格式化字符串 "%T@"
,在分析 %T
之前,先看下 %Ak
这里的描述
首先,%Ak
表示文件最后的访问日期,然后 k
表示一个占位符,后面可以跟着比如 @ H I k l
等符号,表示不同的含义,其中 @
表示以 Unix 时间戳(即自 1970-01-01 00:00:00 UTC 起的秒数,浮点数形式)输出时间
接着再来看 %Tk
k
这里的描述和前面 %Ak
是一样的,不过这里换成了 T
,表示文件的最后修改日期
所以下面这个表达式的含义就很清晰了
-printf "%T@"
表示打印出所找文件的最后修改日期,以 Unitx 时间戳浮点数的形式打印出来
ok,先到这里,下篇 blog 继续