![`stat` 输出格式:截断日期字段](https://linux22.com/image/135735/%60stat%60%20%E8%BE%93%E5%87%BA%E6%A0%BC%E5%BC%8F%EF%BC%9A%E6%88%AA%E6%96%AD%E6%97%A5%E6%9C%9F%E5%AD%97%E6%AE%B5.png)
在一种stat
格式中(至少是我从 Linux 上的 bash 获得的格式),可以使用格式修饰符:例如%010s
将强制大小字段至少为 10 个字符,并用零填充到左侧(顺便说一句,这是否在某处记录?)
是否有等效的技巧来限制字段的长度?我想删除 %xyz 格式中秒的小数部分。或者我必须使用 sed/awk 对输出进行后处理吗?
答案1
使用 GNU 工具,
date -r file +'%F %T %z'
这将获取给定文件的上次修改的时间戳(无亚秒分辨率),并用于date
将其重新格式化为与生成的格式相同的格式stat -c %y file
。
例子:
$ stat -c '%y' file
2021-03-17 08:53:39.540802643 +0100
$ date -r file +'%F %T %z'
2021-03-17 08:53:39 +0100
可以直接printf
对%y
格式规范使用 -like 格式,但不能修改中间的一段字符串:
$ stat -c '%.19y' file
2021-03-17 08:53:39
这会在 19 个字符后截断字符串,从而删除亚秒数据,但时区信息也被忽略。
答案2
好的,因为我可以指定类似 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
答案3
这是一种从统计时间戳中提取部分然后生成自定义日期输出的便捷方法
#!/bin/bash
given_file=$1 # supply file to get backed up with timestamp
answer_interstital=$(stat -c '%.16y' $given_file) # 2021-08-23 15:09 stat given file extract out last changed timestamp using the -c flag
# the '%.16y' specifies we want 16 character wide format of timestamp
first_portion=$( echo $answer_interstital | cut -c6-7,9-10) # 0823
second_portion=$(echo $answer_interstital | cut -c12-13,15-16) # 1509
cool_lastchanged_timestamp="${first_portion}_${second_portion}" # print both of above portions separated with an underbar
backup_filename=${given_file}~~${cool_lastchanged_timestamp} # create backup file using formatted timestamp
cp -p $given_file $backup_filename # backup file from some_file to some_file~~0823_1509
答案4
扩展对 @nohillside 给出的原始问题的评论,修改日期信息格式的最灵活方法是stat
使用来自它的纪元以来的时间并使用命令对其进行格式化date
。
例如:
date --date="@"`stat -c '%Y' file` "+%F %r"
结果:
2023-02-17 01:17:24 PM
在"+FORMAT"
参数中,您可以使用可用于 date 命令的任何修饰符,您可以使用 进行检查man date
。