You Know Nothing
  • 主页
  • 分类
  • 标签
  • 归档

利用 Mac stat 添加文件创建时间、最后修改时间

  • 1. 自动添加文件创建时间、最后修改时间
  • 2. 附:stat 命令详情
    • 2.1 参数
    • 2.2 格式

Pelican 根据 .md 文件生成网页的时候需要 metadata,所以写个命令行自动添加文件创建时间、最后修改时间,这样写博客的时候只需要把 title、category 和 tags 标签填上就行了,其中用了 stat命令。

1. 自动添加文件创建时间、最后修改时间

stat命令的 a, m, c, B 参数分别代表上次访问或修改时间文件,上次更改 inode 的时间或 inode 的生成时间( UNIX 时间戳),所以我们可以通过提取这些信息实现想要的功能。唯一需要注意的是,结果是UNIX时间戳,我们需要将其转换为普通时间。

UNIX 时间,或称 POSIX 时间是 UNIX 或类 UNIX 系统使用的时间表示方式:从协调世界时1970年1月1日0时0分0秒起至现在的总秒数,不考虑闰秒。在多数 UNIX 系统上 UNIX 时间可以通过date +%s指令来检查。

在 Mac 系统是由 UNIX 时间戳转化为普通时间的指令为: UNIX 时间戳转化为普通时间

所以我们先根据stat获得文件的创建时间: 根据stat获得文件的创建时间

然后转化为普通时间: 转化为普通时间

以下为脚本:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#! /bin/bash

# 输入:需要修改的文件
static=$1

# 提取创建时间
create_time=$(date  -r$(stat -f "%B" $static) "+%Y-%m-%d %H:%M:%S")
# 提取修改时间
modify_time=$(date  -r$(stat -f "%m" $static) "+%Y-%m-%d %H:%M:%S")
# 查找Date标签的行号
num1=$(head -5 $static | grep -n 'Date' | cut -d ":" -f 1)
# 查找Modified标签的行号
num2=$(head -5 $static | grep -n 'Modified'| cut -d ":" -f 1)

# 如果Date标签行号为空,说明不存在Date标签,则插入Date
if [ -z "$num1" ]; then
    sed -i '' -e "2s/^//p; 2s/^.*/Date: $create_time/" $static   
fi
# 如果Modified标签行号为空,插入Modified
if [ -z "$num2" ]; then
    sed -i '' -e "3s/^//p; 3s/^.*/Modified: $modify_time/" $static
else
    # 否则,替换Modified标签到最新时间
    sed -i '' ${num2}d $static
    sed -i '' -e "3s/^//p; 3s/^.*/Modified: $modify_time/" $static
fi

2. 附:stat 命令详情

stat显示有关文件的信息。 不需要读取,写入或执行指定文件的权限,但必须可搜索通向该文件的路径名中列出的所有目录。 如果没有给出参数,stat将显示有关标准输入的文件描述符(stdin)的信息。

当作为readlink调用时,仅打印符号链接的目标。 如果给定的参数不是符号链接,则readlink将不打印任何内容并退出并显示错误。

显示的信息是通过使用给定参数调用lstat系统调用并解释返回的结构来获得的。

2.1 参数

-F           与ls命令的 -F 参数一样,在作为目录的每个路径名之后显示斜杠('/'),在每个可执行的路径名后面显示星号('*'),在每个符号链接后显示at符号('@'), 在每个without文件后面显示百分号('%'),每个套接字后显示等号('='),以及在每个FIFO文件后面显示一个垂直条('|')。 -F 的使用意味着 -l

-f format           使用指定的格式显示信息

-L           使用stat而不是lstat。 如果文件是符号链接,则stat给出的信息是链接文件目标文件的信息,而不是链接文件本身

-l           将输出以ls -lT格式显示,即显示文件的完整时间信息,包括月,日,小时,分钟,秒和年

-n           输出不强制换行

-q           如果对stat或lstat的调用失败,则不显示失败消息。以readlink方式运行时,会自动禁止错误消息

-r           显示原始信息。即,对于stat结构(UNIX/Linux系统中定义的结构体)中的所有字段,显示原始数值(例如,自纪元以来的秒数等)

-s           在“shell输出”中显示信息,适用于初始化变量

-t timefmt           使用指定的格式显示时间戳。 此格式直接传递给strftime命令

-x           从某些Linux发行版中以更详细的方式显示信息

2.2 格式

格式字符串类似于printf格式,因为它们以 % 开头,然后是一系列格式化字符,最后是一个字符,用于选择要格式化的 struct stat 字段。 如果 % 后面紧跟 n,t,% 或 @ 之一,则会打印换行符,制表符,百分号或当前文件号,否则将检查字符串是否包含以下内容:

以下是任何可选标志:

#           为八进制和十六进制输出选择备用输出形式。 非零八进制输出将具有前导零,并且非零十六进制输出将具有前缀“0x”

+           断言应始终打印指示数字是正数还是负数的符号。 非负数通常不打印带符号

-           将字符串输出对齐到字段的左侧,而不是右侧

0           将左边距的填充字符设置为“0”字符,而不是空格

space           在非负有符号输出字段的前面保留一个空格。 如果同时使用‘+’ ,则‘+’ 将覆盖空格

以下是任何可选字段:

size           可选的十进制数字字符串,指定最小字段宽度

prec           由小数点'.'和十进制数字字符串组成的可选精度,指示最大字符串长度,浮点输出中小数点后出现的位数,或数字输出中显示的最小位数

fmt           可选的输出格式说明符,它是D,O,U,X,F 或 S 之一。它们分别表示带符号的十进制输出,八进制输出,无符号十进制输出,十六进制输出,浮点输出和字符串输出。 某些输出格式不适用于所有字段。 浮点输出仅适用于 timespec 字段(a,m 和 c 字段)。

           特殊输出说明符S可用于指示输出(如果适用)应为字符串格式。 可与以下标志结合使用:

           amc 以strftime格式显示日期

           dr 显示实际设备名称

           gu 显示组或用户名

           p 以ls -lTd显示文件模式

           N 显示文件名

           T 显示文件类型

           Y 在输出中插入“ -> ”。 请注意,Y 的默认输出格式是字符串,但如果明确指定,则会预先添加这四个字符

sub           可选的子字段说明符(高,中,低)。仅适用于 p,d,r 和 T 输出格式。 它可以是以下之一:

           H “高”,指定来自 r 或 d 的设备的主要编号,来自 p 的字符串形式的权限的“用户”位,来自 p 的数字形式的文件“type”位,以及 T 的长输出形式

           L “低”,指定来自 r 或 d 的设备的次要编号,来自 p 的字符串形式的权限的“其他”位,来自 p 的数字形式的“用户”,“组”和“其他”位, 当与 T 一起使用时,文件类型的ls -F样式输出字符(对此使用 L 是可选的)

           M “中”,指定 p 的字符串输出形式的权限的“组”位,或 p 的数字形式的 “suid”,“sgid” 和 “sticky” 位

datum           必填字段说明符,是以下之一:

           d 文件所在的设备

           i 文件的inode编号

           p 文件类型和权限

           l 文件的硬链接数

           u, g 文件所有者的用户ID和组ID

           r 字符和块设备专用文件的设备编号

           a, m, c, B 上次访问或修改时间文件,上次更改 inode 的时间或 inode 的生成时间(UNIX时间戳)

           z 文件大小(以字节为单位)

           b 分配给文件的块数

           k 最佳文件系统I / O操作块大小

           f 用户定义的文件标志

           v Inode 生成号

           以下四个字段说明符不是直接从struct stat中的数据中提取的,而是:

           N 文件的名称

           T 文件类型,类似ls -F,如果给出子字段说明符H,则采用更具描述性的形式。

           Y 符号链接的目标

           Z 从字符或块特殊设备的rdev字段扩展为“major,minor”,并为所有其他设备提供大小输出

只有 % 和字段说明符是必需的。大多数字段说明符默认为 U 作为输出形式;p 默认输出形式是 O;a、m、c 默认输出形式是 D,Y、T、N 默认输出形式是 S。


RELATED

  • Mac 在桌面上显示英语单词并自动更新
  • Atom 快捷键

OLDER

  • C++ Primer 第一章 开始
  • Python 教程
  • HTML 入门
  • X3DOM 图像和视频纹理
  • Python 100 days

NEWER

  • C++ Primer 第二章 变量和基本类型
  • C++ Primer 第三章 字符串、向量和数组
  • C++ Primer 第四章 表达式
  • CSS 入门
  • 剑指 offer (1)

发布日期

2018-10-06 19:07:36

最后更新

2018-10-07 10:38:50

分类

Linux

标签

  • Mac 3
  • Powered by Pelican. Theme: Elegant by Talha Mansoor