根据用于备份文件的方法,修改或更改的日期应该反映它被复制的时间 - 例如,如果您使用 cp -p 备份它们,修改的日期不会更改,但更改的日期会反映复制的时间。
stat
您可以使用以下命令获取此信息:
stat <filename>
这将返回以下内容(以及未显示的其他文件相关信息):
Access: 2016-05-28 20:35:03.153214170 -0400
Modify: 2016-05-28 20:34:59.456122913 -0400
Change: 2016-05-29 01:39:52.070336376 -0400
此输出来自我在显示为“更改”时使用 cp -p 复制的文件。
您可以通过使用指定格式调用 stat 来获取更改时间:
stat -c '%z' <filename>
2016-05-29 01:39:56.037433640 -0400
或自纪元以来以秒为单位的大写 Z。您可以将它与 date 命令结合起来仅提取日期(或使用 grep 等)
date -d "`stat -c '%z' <filename>" -I
2016-05-29
该命令find
可用于按时间范围查找文件,在这种情况下,使用标志-cmin
“更改的分钟”、-mmin
“修改的分钟”或不太可能-amin
的“访问的分钟”。获取自午夜以来的分钟数的命令序列有点难看,但它有效。
我们必须通过 find 参数“自上次更改文件以来的分钟数”(或修改,如果该标准有效)。所以首先你必须计算自午夜以来的分钟数,然后运行 find。
min_since_mid=$(echo $(( $(date +%s) - $(date -d "(date -I) 0" +%s) )) / 60 | bc)
展开一点:
$(date +%s)
== 从纪元到“现在”的秒数
"(date -I) 0"
== 今天的日期,格式为“YYYY-MM-DD 0”,0 表示当天还有 0 秒
$(date -d "(date -I 0" +%s))
== 从纪元到今天午夜的秒数
- 然后我们(有效地)回显($now - $midnight)/ 60 到 bc 以将结果转换为分钟。
find 调用通过自午夜以来的分钟数,前导“-”表示最多 X 分钟前。A'+' 表示 X 分钟或更早。
find /path/to/base/folder -cmin -"$min_since_mid"
实际答案
最后,要在给定目录(和子目录)中创建自今天午夜以来已更改的文件的 tgz 存档,请使用以下两个命令:
min_since_mid=$(echo $(( $(date +%s) - $(date -d "(date -I) 0" +%s) )) / 60 | bc)
find /path/to/base/folder -cmin -"${min_since_mid:-0}" -print0 -exec tar czvf /path/to/new/tarball.tgz {} +
find 的 -print0 参数告诉它用空字符串分隔文件,这将防止名称中的空格等问题。
我唯一不确定的是您应该使用更改时间(-cmin)、修改时间(-mmin)或访问时间(-amin)。看看你的备份文件,看看哪个字段准确地反映了备份的日期/时间——我想改变了时间,但我不确定。
更新:更改-"$min_since_mid"
为 -"${min_since_mid:-0}" 以便如果未设置 min_since_mid 您不会因参数无效而出错 - 您将不会得到任何结果。如果该变量设置不正确,您还可以使用 if 语句将 find 括起来以阻止调用。