我将数据库备份存储在目录结构中
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 ..
这应该有效。