我有一个文件列表
- 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
开头的日期转换回一位数字的日期 - 此时,您可以使用
head
或tail
根据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/