从目录结构年/月/日/时间中获取最新文件

从目录结构年/月/日/时间中获取最新文件

我将数据库备份存储在目录结构中

year/month/day/time/backup_name

一个例子是

basics_mini/2012/11/05/012232/RATIONAL.0.db2inst1.NODE0000.20110505004037.001 basics_mini/2012/11/06/012251/RATIONAL.0.db2inst1.NODE0000.20110505003930.001

请注意,无法使用备份文件中的时间戳。在自动化测试开始之前,服务器时间设置为 5.5.2011

所以问题是如果我传递“基本目录”(基础知识_迷你)到我要编码的某个函数。

我需要恢复最新的数据库。我在 php 中这样做,但我想知道是否有一个简单的 shell 脚本解决方案。

答案1

find 应该适合您的需求:

find "/path/to/backup_dir" -type f|sort -r|head -n1

仅当您的月份和日期文件夹中有前导零(如您的示例中所示)时,这才有效

如果您想要具有特定文件名(或模式)的备份,请在查找参数中添加名称模式,例如

find "/path/to/backup_dir" -type f -name "*db2inst1*"|sort -r|head -n1

...或用于-iname不区分大小写的模式

现在详细介绍上述命令:

  • find "/path"递归列出给定路径中的所有文件/目录(除非您使用进一步过滤:
  • find 的参数-type f过滤掉所有非常规文件)
  • -name-iname根据特定模式匹配文件
  • sort按相反顺序对输出进行排序 ( -r)
  • head -n1-n 1仅打印其输入的第一行 ( ) 并在执行此操作后立即退出。

答案2

find 'basics_mini' -type f | 
sed 's/.*basics_mini\///' |
sort -t '/' -k1nr -k2nr -k3nr -k4nr |
head -1

这将在您的备份目录中查找文件,然后sed将删除前导路径(直到您的year目录)。然后,排序会以“/”分隔路径名,并对字段1、2、3、4,即年、月、日、时间进行数字排序。最后,head -1将返回输出的顶行。

当然,即使有多个相同的最新条目,这也只会返回 1 个文件(如果您担心这一点)。

答案3

使用此命名方案,最新的备份位于按字典顺序排列的最后一个子目录中。您可以直接在 shell 中获取最新的目录,利用通配符按字典顺序展开的事实。

cd basics_mini
set [0-9][0-9][0-9][0-9]/*/*/*
shift $(($#-1))
echo "The most recent backup is in $1"

在 zsh 中,您可以使用 glob 限定符直接获取最后一个目录。

echo "The most recent backup is in" basics_mini/[0-9][0-9][0-9][0-9]/*/*/*([-1])

答案4

find -maxdepth 1 -type ['d' for directory or 'f'for file] | ls -t | head -1 .. 

这应该有效。

相关内容