我需要在两个 suse 服务器之间复制数据库日志文件,我只对 2013 年 3 月 10 日至 2013 年 3 月 13 日之间的文件感兴趣
需要在复制之前压缩文件,因此我对它们进行 tar 和 scp。目前我正在使用tar -cvzf /tmp/saas_archive_logs.tar.gz /var/lib/edumate/backup/archive_logs/db2inst1/SAAS --newer-mtime=2013-03-10
它为我提供从 2013 年 3 月 10 日至今的所有文件。但我不需要全部。我没有找到任何 tar 开关。
答案1
正如 Bichoy 所指出的,您可以使用该find
命令查找具有特定访问、创建和修改时间的文件。然而 -mtime 以 24 小时为增量进行偏移,并且并不总是方便计算,除非您想要特定数量的“天”前的内容。您需要将其与-daystart
“四舍五入”合并到当天的开始时间。
我认为在您的情况下更方便的是 -newermt 选项,它采用日期字符串(而不是像大多数 -newerXY 版本那样的参考文件的名称)
find
将其与的-print0
选项结合起来处理名称中带有空格的文件,并且可以选择-type f
在您感兴趣的时间段内不获取任何目录:
find /var/lib/edumate/backup/archive_logs/db2inst1/SAAS \
-newermt 20130310 -not -newermt 20130314 -type f -print0 \
| xargs -0 tar -cvzf /tmp/saas_archive_logs.tar.gz
这有一个大问题:如果找到的文件数量变得太长,将根据需要多次xargs
调用其命令(在本例中)以适应命令行上的参数,而命令行上的参数不是无限的。为了避免这种情况,我总是使用,它从标准输入读取文件名。使用参数获取 POSIX tar 文件,在您的情况下,您需要通过管道传输输出以获得所需的结果:tar
xargs
cpio
--format=ustar
gzip
find /var/lib/edumate/backup/archive_logs/db2inst1/SAAS \
-newermt 20130310 -not -newermt 20130314 -type f -print0 \
| cpio --create --null --format=ustar \
| gzip > /tmp/saas_archive_logs.tar.gz
答案2
您可以检查该find
命令以获取需要去皮的文件列表。您可以使用普通-atime
, -btime
, -mtime
... 参数与-not
参数组合来指定开始和结束日期(精确到秒)。然后,您可以将输出通过管道传输到xargs
,然后再传输到tar
。find
有关时间参数的详细信息,请查看 的手册页。
更新:
正如 Anthon 建议的,您可以使用 +/- 修饰符来-mtime
指定周期,而不使用-not
。这是一个例子:
find . -mtime -5d2h3m10s -mtime +4d0h15m20s -print0 | xargs -0 tar cjvf mytar.tar.bz2
其中d, h, m, s
对应于天、小时、分钟和秒分别。这将给出更新于5d2h3m10s
和旧于的文件4d0h15m20s