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

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

一些限制是:

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

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

  • 要求添加到本地目录的date, 而不是文件的创builddate。

  • 我在下载阶段运行重复数据删除; 然而,(使用ncftp),检查包括比较远程和本地目录。 一个策略是每天创build一个新文件夹,下载文件并在午夜后的某个时间进行tar。 由于新的本地文件夹是空的,新的一天的第一次预定下载将获取远程服务器上的所有文件,这是一个问题。

由于受到限制,我考虑将基于“添加date”的文件归档到中央文件夹。 使用Mac可以很好地工作,因为HFS +存储扩展的元数据,如创builddate和添加date。 所以我可以把tar命令与下面的东西结合起来:

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

但似乎并没有在Linux下的模拟(至less不是我知道的EXT4)。

我乐于接受任何forms的解决scheme,以避免在随后的一天中将文件翻倍。 最终的结果应该是一个完整的tar.gz文件的档案目录,如下所示:

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

根据用于备份文件的方法,修改或更改的日期应反映复制的时间 – 例如,如果使用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在'change'时显示。

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

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

或者从那个时代开始用大写Z来表示。 你可以把它和date命令结合起来(或者使用grep等)

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

命令find可以用于按时间段查找文件,在这种情况下,使用标志-cmin “已更改分钟”, -mmin “已修改分钟”或不太可能, -amin “已访问分钟”。 从午夜开始获得分钟的命令序列有点难看,但是它起作用。

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

 min_since_mid=$(echo $(( $(date +%s) - $(date -d "(date -I) 0" +%s) )) / 60 | bc) 

展开一下:

  • $(date +%s) ==自从epoch到现在为止的秒数=
  • "(date -I) 0" ==今天的日期格式为“YYYY-MM-DD 0”,0表示当天0秒
  • $(date -d "(date -I 0" +%s)) ==从时代直到今天午夜的秒数
  • 然后我们(有效地)回应($ now – $ midnight)/ 60到bc将结果转换成分钟。

查找呼叫从午夜开始通过分钟,前导“ – ”表示X分钟前。 “+”表示X分钟或更久以前。

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

实际的答案

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

 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 {} + 

查找的-print0参数告诉它用空字符串分隔文件,这将防止名称中的空格问题等等。

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

更新:更改-"$min_since_mid"为 – “$ {min_since_mid:-0}”,这样,如果min_since_mid没有设置,您将不会错误与无效的参数 – 你只是不会得到任何结果。 如果该变量没有正确设置,您也可以用if语句包围查找以阻止该调用。