`stat` 输出格式:截断日期字段

xen*_*oid 2 bash coreutils

在一种stat格式(至少是我从 Linux 上的 bash 获得的格式)中,可以使用格式修饰符:例如,%010s将强制大小字段至少为 10 个字符,并在左侧填充零(顺便说一句,这是否记录在某处?)

是否有等效的技巧来限制字段的长度?我想在 %xyz 格式中删除秒的小数部分。或者我是否必须使用 sed/awk 对输出进行后处理?

Kus*_*nda 11

使用 GNU 工具,

date -r file +'%F %T %z'
Run Code Online (Sandbox Code Playgroud)

这将获得给定文件上次修改的时间戳(无亚秒分辨率),并用于date将其重新格式化为与stat -c %y file生成的格式相同的格式。

例子:

date -r file +'%F %T %z'
Run Code Online (Sandbox Code Playgroud)
$ stat -c '%y' file
2021-03-17 08:53:39.540802643 +0100
Run Code Online (Sandbox Code Playgroud)

可以直接printf%y格式规范使用-like 格式,但不能修改中间的一段字符串:

$ date -r file +'%F %T %z'
2021-03-17 08:53:39 +0100
Run Code Online (Sandbox Code Playgroud)

这会截断 19 个字符后的字符串,从而删除亚秒级数据,但时区信息也被排除在外。

  • @xenoid 您专门询问了截断时间戳的问题。你从来没有说过你想要的最终结果是什么。 (2认同)

xen*_*oid 1

好的,因为我可以指定类似 printf 的长度/垫(%010s例如),让我们回到原始 printf 文档,该文档记录了实际上是字段最大长度的精度。还有 tadaaa...它可以按stat格式工作!(此处被截断以仅保留日期部分):

stat -c '%.10y %10s %n' /boot/*
2018-05-17    1501659 /boot/abi-4.13.0-43-generic
2018-05-30    1501528 /boot/abi-4.13.0-45-generic
2018-05-17     213220 /boot/config-4.13.0-43-generic
2018-05-30     213220 /boot/config-4.13.0-45-generic
1970-01-01       4096 /boot/efi
2018-06-15       1024 /boot/grub
2018-05-22   52211016 /boot/initrd.img-4.13.0-43-generic
2018-06-22   52210415 /boot/initrd.img-4.13.0-45-generic
2017-04-08      12288 /boot/lost+found
2016-01-28     182704 /boot/memtest86+.bin
2016-01-28     184380 /boot/memtest86+.elf
2016-01-28     184840 /boot/memtest86+_multiboot.bin
2018-05-17        255 /boot/retpoline-4.13.0-43-generic
2018-05-30        255 /boot/retpoline-4.13.0-45-generic
2018-05-17    3884045 /boot/System.map-4.13.0-43-generic
2018-05-30    3883942 /boot/System.map-4.13.0-45-generic
2018-05-17    7713296 /boot/vmlinuz-4.13.0-43-generic
2018-05-22    7715224 /boot/vmlinuz-4.13.0-43-generic.efi.signed
2018-05-30    7712560 /boot/vmlinuz-4.13.0-45-generic
2018-06-14    7714488 /boot/vmlinuz-4.13.0-45-generic.efi.signed
Run Code Online (Sandbox Code Playgroud)