如何用 coreutils du 的 --time birth 扩展查看文件创建时间?
【免费下载链接】coreutilsCross-platform Rust rewrite of the GNU coreutils项目地址: https://gitcode.com/GitHub_Trending/co/coreutils
GNU 版的du --time只支持atime/ctime等取值,想在目录大小的汇总输出里同时看到文件的创建时间(birth time)做不到。uutils coreutils(本项目的 Rust 重写版)对du增加了扩展:--time参数接受birth和creation两个取值,用于显示创建时间,这一点在 扩展文档 中明确说明。本文围绕这一条命令展开:如何运行它、输出长什么样、时间格式怎么调,以及在哪些平台上会失败。
准备:安装 uutils coreutils
前提是拿到 uutils 版本的核心工具,而不是发行版自带的 GNU 版本。按 安装文档,用 Cargo 安装:
# Unix like cargo install coreutils --features unix --locked # Windows cargo install coreutils --features windows --locked如果不想自行构建,Alpine、Arch、Debian、Fedora 等发行版也有打包好的uutils-coreutils/rust-coreutils包,具体命令以 docs/src/installation.md 为准。安装后du指向 uutils 版本时,--time=birth才可用。
执行:用 --time=birth 显示创建时间
基本用法是给--time直接带上取值:
du --time=birth <目录或文件路径>creation是等价的别名,du --time=creation效果相同。注意该参数要求取值紧跟等号(实现上设置了require_equals,见 du.rs 中的参数定义),--time birth这种空格写法不被接受;取值也支持atime(别名access、use)和ctime(别名status),本场景只关心birth/creation。
输出为三列、以 Tab 分隔:换算后的大小、时间戳、路径。时间列按本地时区格式化(项目测试中通过设置TZ=UTC来固定输出),默认风格为long-iso,形如YYYY-MM-DD HH:MM。以 测试文件 中的--time用例为例(文档示例,时间值取决于实际文件的创建时间):
0 2016-06-16 00:00 date_test测试里对--time=birth的断言就是检查时间列匹配正则[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2},即YYYY-MM-DD HH:MM这个形状,而不是某个固定时间值。
调整时间显示格式
--time-style控制时间列的格式,取值与date风格类似(见 du 错误信息定义 中列出的合法参数):
du --time=birth --time-style=full-iso ./mydir # 完整 ISO,含秒与偏移 du --time=birth --time-style=iso ./mydir # 仅 YYYY-MM-DD du --time=birth --time-style=+%Y-%m-%d ./mydir # date 风格自定义full-iso对应的文档示例输出(来自测试,仅作格式参考):
0 2016-06-16 00:00:00.000000000 +0000 date_test未显式指定--time-style时,程序会回落到环境变量TIME_STYLE(前缀posix-会被剥离),再否则使用默认的long-iso(见 du.rs 中 parse_time_style)。
验证与失败判断
正常成功的判断依据是:命令退出码为 0,且每行输出的第二列是时间字符串。两种异常情形在源码和文案里都有明确定义:
平台不支持:如果运行平台不提供创建时间,命令直接报错,错误文案见 en-US.ftl:
du: 'birth' and 'creation' arguments for --time are not supported on this platform.创建时间的底层获取依赖 Rust 标准库的
Metadata::created()(见 fsext.rs 中MetadataTimeField::Birth => md.created().ok()),所以是否可用取决于平台和文件系统是否报告 birth time。个别条目取不到时间:时间列会打印
???占位,而不是整条命令失败(见 du.rs 中 print_stat)。项目测试中 Windows 平台对不支持的字段(如 ctime)就是断言0 ??? date_test这一形状(文档示例)。
如果你想在脚本里自动校验时间列格式,可复用测试的做法:对--time=birth的输出按行匹配^[0-9]+\t[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}\t(默认long-iso风格下)。
限制说明
du --time对目录显示的是目录内所有文件中“最新”的那个对应时间(源码中各条目的时间取max累并到父目录),所以目录行的创建时间列实际反映的是其内容里最晚的创建时间,这与 帮助文案 中 “time of the last modification of any file in the directory, or any of its subdirectories” 的描述方式一致。--time只接受atime、ctime、creation/birth这几组取值,写错取值或给出空的--time=(含TIME_STYLE为空字符串的情况)都会报错,例如du: invalid argument '' for 'time style'(见 test_du_time_style_empty)。- 该功能是 uutils 相对 GNU 的扩展,GNU
du不支持--time=birth;在依赖 GNU 行为的脚本中引入它需要留意兼容性。
du的这条扩展就是为“列目录大小时顺便看到创建时间”这一场景设计的,命令形态、格式参数与失败表现如上,更多 GNU 扩展差异可继续查 docs/src/extensions.md。
【免费下载链接】coreutilsCross-platform Rust rewrite of the GNU coreutils项目地址: https://gitcode.com/GitHub_Trending/co/coreutils
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考