我正在编写一个脚本来创建文件夹及其内容的备份。系统会提示用户输入要备份的文件夹名称。备份副本将使用以下约定命名:原始文件夹名称_文件夹中最后修改的任何文件的日期和时间。该脚本可以很好地进行复制,但我对如何提取上次修改文件的日期和时间感到困惑。
这是一个例子:
- 用户在提示符下输入 Documents/Graphite,以便复制 Graphite 文件夹及其内容
- Graphite 文件夹内有文件以及几个包含文件的子文件夹
- Graphite 文件夹及其子文件夹中最近修改的文件名为 index.js,位于 services 子文件夹中,其日期/时间戳为 1/28/2020 14:28:54
对于上面概述的示例,当脚本运行需要发生两件事:
a)终端为最近修改的文件输出以下内容:
2020-01-28 14:28:54 ./services/index.js
b)services/index.js 文件的最后修改日期和时间戳以这种格式存储在变量中2020-01-28_14-28-54
的目的将日期/时间存储在变量中的原因是它将用于修改复制的文件夹的名称。
对此的回应邮政作者:@Heppo,于 2011 年 9 月 16 日 18:21 推荐将此用于类似的用例:
#!/bin/bash
find $1 -type f -print0 | xargs -0 stat --format '%Y :%y %n' | sort -nr | cut -d: -f2- | head
这与上面的要求 a) 很接近,只是它显示超过 1 个文件并且时间戳格式不同。尽管将命令插入explainshell.com,但我不确定如何更改它以满足要求a)。
任何有关如何获取这两个要求的信息的指导将不胜感激,因为我是 Linux 新手。
答案1
由于您使用的是 Ubuntu 并且有find
可用的 GNU,因此您可以使用该选项打印最新的修改日期-printf
。
find "$1" -type f -printf '%TY-%Tm-%Td_%TH-%TM-%TS\n' | sort -r | head -n1
会输出类似的东西
2020-01-28_14-28-54.0000000000
不幸的是,您必须去掉秒的小数部分,因为没有它就无法打印秒。
lastmod=$(find "$1" -type f -printf '%TY-%Tm-%Td_%TH-%TM-%TS\n' | sort -r | head -n1)
lastmod=${lastmod%.*} # strip fractional part