按目录中文件的日期字符串对目录进行排序

按目录中文件的日期字符串对目录进行排序

我正为此头疼。我试图通过该目录中的文件来排序多个目录,该目录包含备份的创建日期。

这是为了订购我的备份,我无法使用目录的 ctime 或 atime 执行此操作,因为它们会同时复制到其他主机。

假设我有以下结构:

/backups/full
/backups/incremental1
/backups/incremental2
/backups/incremental3
...

在这些备份目录中,我们有:

/backups/full/date.txt
/backups/incremental1/date.txt
/backups/incremental2/date.txt
..

在该date.txt文件中,我们有一个字符串:creation_time = 2020-04-03 15:26:19对于每个。

我怎样才能制作一个脚本来按其创建时间字符串对这些目录进行排序并将它们放入一个数组中,这样我就可以执行

array=(full incremental1 incremental2 incremental3)

for dir in @{array[@]}; do

我想让它们在变量或数组中排序

答案1

假设 的结构date.txt始终相同并且目录名称不包含换行符,这样的操作应该可以解决问题:

for d in /backups/*/date.txt; do
    printf '%s\t%s\n' "$(grep creation_time "$d")" "$(basename "$(dirname "$d")")"
done | sort | cut -f2-

输出:

full
incremental1
incremental2
incremental3

如何将其放入数组中应该相当简单,但您可能不需要它,因为您可以将结果输入循环whilexargs类似的内容中。

答案2

使用shelldate.txt中文件的上次修改时间戳zsh

for backupdir in /backup/*/date.txt(ome['REPLY=$REPLY:h']); do
    # do whatever you need to do
    # with the directory path in $backupdir
done

这使用通配模式来匹配所有date.txt文件。模式末尾的 globbing 限定符对匹配进行排序,以便最近修改的匹配位于第一个(这就是所做的),并从匹配的路径名中om删除字符串(就像会做的那样)。/date.txtdirname

这显然是假设date.txt在将日期写入文件时(大约在进行备份的同时)文件已更新。如果您使用 复制数据,则将保留此时间戳(以及目录时间戳)rsync --archive

bash

zsh -c '
for backupdir in /backup/*/date.txt(ome['\''REPLY=$REPLY:h'\'']); do
    # do whatever you need to do
    # with the directory path in $backupdir
done'

相关内容