Bash命令每天根据添加的日期归档文件

时间:2016-05-27 14:48:02

标签: linux bash ftp tar backup-strategies

我有一套脚本,涉及从远程服务器下载文件然后解析它们。每天晚上,我想创建当天下载的文件的存档。

一些限制因素是:

  • 从Windows服务器下载到Ubuntu服务器。

  • 无法删除远程服务器上的文件。

  • 要求添加日期到本地目录,创建文件的日期。

  • 我在下载阶段运行重复数据删除;但是,(使用ncftp),检查涉及比较远程和本地目录。一种策略是每天创建一个新文件夹,将文件下载到其中,然后在午夜后的某个时间点播它。出现问题的是,新一天的第一次预定下载将获取远程服务器上的所有文件,因为新的本地文件夹是空的。

由于受到限制,我考虑简单地根据"添加日期"存档文件。到中央文件夹。这非常适合使用Mac,因为HFS +存储扩展元数据,例如创建日期和添加日期。所以我可以将tar命令与下面的命令结合起来:

 mdls -name kMDItemFSName -name kMDItemDateAdded -raw *.xml | \ 
 xargs -0 -I {} echo {} | \ 
 sed 'N;s/\n/ /' | \

但似乎并不是linux下的模拟(至少不是我所知道的EXT4)。

我愿意接受任何形式的解决方案,以便在接下来的一天内将文件翻倍。最终结果应该是一个充满tar.gz文件的档案目录,如下所示:

files_$(date +"%Y-%m-%d").tar.gz

1 个答案:

答案 0 :(得分:2)

根据用于备份文件的方法,修改或更改的日期应反映复制的时间 - 例如,如果您使用cp -p备份它们,则修改日期不会更改,但更改的日期不会更改日期将反映复制的时间。

您可以使用stat命令获取此信息:

stat <filename>

将返回以下内容(以及未显示的其他文件相关信息):

Access: 2016-05-28 20:35:03.153214170 -0400
Modify: 2016-05-28 20:34:59.456122913 -0400
Change: 2016-05-29 01:39:52.070336376 -0400

此输出来自我在显示为“更改”时使用cp -p复制的文件。

您可以通过使用指定格式调用stat来获取更改时间:

stat -c '%z' <filename>
2016-05-29 01:39:56.037433640 -0400

或以大写为止的时间以秒为单位。你可以将它与date命令结合起来,只提取日期(或使用grep等)

date -d "`stat -c '%z' <filename>" -I
2016-05-29

命令find可用于按时间范围查找文件,在这种情况下使用标记-cmin'更改分钟',-mmin'修改分钟'或不太可能,{ {1}}'访问分钟'。从午夜开始获取分钟的命令序列有点难看,但它确实有效。

我们必须通过查找“自文件上次更改后的分钟数”的参数(或修改,如果该条件有效)。所以首先你必须计算自午夜以来的分钟数,然后运行find。

-amin

稍微展开:

  • min_since_mid=$(echo $(( $(date +%s) - $(date -d "(date -I) 0" +%s) )) / 60 | bc) ==秒从'epoch'到'now'
  • $(date +%s) ==今天的日期格式为“YYYY-MM-DD 0”,0表示当天0秒
  • "(date -I) 0" ==秒从纪元到今天午夜
  • 然后我们(有效地)回复($ now - $ midnight)/ 60到bc将结果转换为分钟。

发现呼叫从午夜开始传递分钟,前导时间为“ - ”,表示最多X分钟前。 “+”表示X分钟或更长时间。

$(date -d "(date -I 0" +%s))

实际答案

最后,要创建自今天午夜以来已更改的给定目录(和子目录)中的文件的tgz存档,请使用以下两个命令:

find /path/to/base/folder -cmin -"$min_since_mid"

find的-print0参数告诉它用空字符串分隔文件,这样可以防止名称中出现空格问题等。

我唯一不确定的是你应该使用更改时间(-cmin),修改时间(-mmin)或访问时间(-amin)。看看你的备份文件,看看哪个字段准确反映了备份的日期/时间 - 我想会改变时间,但我不确定。

更新:将min_since_mid=$(echo $(( $(date +%s) - $(date -d "(date -I) 0" +%s) )) / 60 | bc) find /path/to/base/folder -cmin -"${min_since_mid:-0}" -print0 -exec tar czvf /path/to/new/tarball.tgz {} + 更改为 - “$ {min_since_mid:-0}”,这样如果未设置min_since_mid,则不会出现无效参数错误 - 您将无法获得任何结果。如果未正确设置该变量,您还可以使用if语句包围查找以阻止调用。