bash - 如何根据文件名中的日期选择最新文件

标签 bash shell unix

我有一个文件列表

- backups/
  - backup.2017-08-28.zip
  - backup.2017-08-29.zip
  - backup.2017-09-2.zip

我希望能够将最新的文件上传回服务器,我可以使用命令来完成:

dobackup ~/backups/backup.2017-09-2.zip

我的问题是:.sh 文件中(以便我可以为此启动自动化/cron 作业)如何获取最新的文件名然后运行那个命令?

限制:我必须使用文件名上的日期而不是修改元数据。

最佳答案

添加更多文件:

backup.2017-08-28.zip
backup.2017-08-29.zip
backup.2017-09-10.zip
backup.2017-09-2.zip
backup.2017-09-28.zip
backup.2017-09-3.zip

像这样的事情怎么样,虽然理所当然,但有点令人费解:

ls -1 backup*zip | sed 's/-\([1-9]\)\./-0\1\./g' | sort [-r] | sed 's/-0\([1-9]\)\./-\1\./g'
  • sed 正在寻找类似 -[0-9] 的匹配。
  • 转义/匹配括号 - \(\) 指定我们要在替换部分引用的模式
  • 新模式将为-0\1.,其中\1是对包含在转义/匹配括号中的第一个模式的引用(即\1 将替换为与 [0-9] 匹配的单个数字)
  • 对句点 (.) 进行转义,以确保将其作为文字句点处理,而不将其视为单位置通配符
  • 此时,ls/sed 构造已生成包含 2 位数天数的文件列表
  • 我们根据需要运行sort(或sort -r)
  • 然后通过 sed 运行结果,将以 0 开头的日期转换回一位数字的日期
  • 此时,您可以使用 headtail 根据 sort/ 删除第一行/最后一行sort -r 你使用的

针对示例文件运行:

$ ls -1 backup*zip | sed 's/-\([1-9]\)\./-0\1\./g' | sort | sed 's/-0\([1-9]\)\./-\1\./g'

backup.2017-08-28.zip
backup.2017-08-29.zip
backup.2017-09-2.zip
backup.2017-09-3.zip
backup.2017-09-10.zip
backup.2017-09-28.zip

# reverse the ordering
$ ls -1 backup*zip | sed 's/-\([1-9]\)\./-0\1\./g' | sort -r | sed 's/-0\([1-9]\)\./-\1\./g'

backup.2017-09-28.zip
backup.2017-09-10.zip
backup.2017-09-3.zip
backup.2017-09-2.zip
backup.2017-08-29.zip
backup.2017-08-28.zip

关于bash - 如何根据文件名中的日期选择最新文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45969857/

相关文章:

python - 如何使用 "at"unix 命令直接从终端调度 python 脚本?

linux - 如何将源服务器中文件的 md5checksum 与 shell 脚本中的目标服务器进行比较?

linux - 我可以在使用 qsub 提交 shell 脚本后删除它而不影响作业吗?

c - C中的暂停功能不响应回车键

linux - BASH 在变量中使用 grep 和 awk

bash - 如何使用 find 命令为多个扩展运行批处理作业?

linux - 非交互中的 awk 遗漏了一些数据

linux - 无法获得这个简单的 sed 命令

linux - 从 "find"输出中删除特殊字符

linux - 在目录的每个级别上运行脚本