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

时间:2017-08-30 21:19:11

标签: 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作业)如何获取最新文件名然后运行该命令?< / p>

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

2 个答案:

答案 0 :(得分:1)

添加更多文件:

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].
  • 这样的匹配项
  • 转义/匹配的parens - \(\)指定我们要在替换部分中引用的模式
  • 新模式将为-0\1.,其中\1是对转义/匹配的parens中包含的第一个模式的引用(即,\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

答案 1 :(得分:1)

您可以在由dot:

分隔的第二个字段上对其进行排序
printf '%s\n' backup.* | sort -t '.' -k2,2r | head -1

backup.2017-09-2.zip