如何在特定日期之间 scp/tar 文件?

Rad*_*dek 10 scp tar date files

我需要在两个 suse 服务器之间复制数据库日志文件,我只对 10.3.2013 - 13.3.2013 之间的文件感兴趣

需要在复制之前压缩文件,因此我将它们和 scp 压缩。目前我正在使用tar -cvzf /tmp/saas_archive_logs.tar.gz /var/lib/edumate/backup/archive_logs/db2inst1/SAAS --newer-mtime=2013-03-10它给我从 10.3.2013 到现在的所有文件。但我不需要所有这些。而且我没有找到任何 tar 开关。

Ant*_*hon 14

正如 Bichoy 指出的,您可以使用该find命令查找具有特定访问、创建和修改时间的文件。但是 -mtime 以 24 小时为增量进行偏移,并且计算起来并不总是很方便,除非您想要特定数量的“天”前的某些内容。您需要将其与-daystart“四舍五入”到一天的开始。

我认为在您的情况下更方便的是 -newermt 选项,它采用日期字符串(而不是像大多数 -newerXY 版本一样的参考文件的名称)

将其与find's-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 
Run Code Online (Sandbox Code Playgroud)

有一个大问题:如果找到的文件数量变得很长,xargstar根据xargs需要多次调用其命令(在这种情况下)以适应命令行上的参数,这不是无限的。为了规避我总是使用cpio,它从标准输入读取文件名。使用--format=ustar获取 POSIX tar 文件的参数,在您的情况下,您需要通过管道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
Run Code Online (Sandbox Code Playgroud)


Bic*_*hoy 6

您可以检查该find命令以获取需要去皮的文件列表。您可以使用 normal -atime, -btime, -mtime... 参数与-not参数结合使用来指定开始和结束日期(精确到秒)。然后,您可以将输出通过管道传输到xargs,然后再通过管道传输到tarfind有关时间参数的详细信息,请查看 的手册页。

更新: 正如 Anthon 建议的那样,您可以使用 +/- 修饰符 with-mtime来指定时间段而不使用-not. 下面是一个例子:

find . -mtime -5d2h3m10s -mtime +4d0h15m20s -print0 | xargs -0 tar cjvf mytar.tar.bz2
Run Code Online (Sandbox Code Playgroud)

其中分别d, h, m, s对应于天、小时、分钟。这将使修改后的文件5d2h3m10s4d0h15m20s

  • `-mtime` 的参数必须是以天为单位的偏移量,这并不总是,除非你在运行时间之间偏移量是固定的。您还可以使用 `-mtime +X` 和 `-mtime -X` 来指定 X 天前的前后,而不是使用 -not。 (2认同)