可以将当前日期添加到 rsync 工作路径吗?
Possible to add current date to rsync working path?
我有一个每小时一次的 rsync cron 任务,用于将新文件添加到备份服务器。目录结构如下: /myfiles/year/month/date
其中年、月、日是文件的实际日期。 Cron 任务定义为 /etc/cron.d
中的文件
问题是我必须指定一个 "root" /myfiles
目录,以使 rsync 每天都在备份位置复制我的文件夹结构。文件量很大 - 每天最多 1000 个文件,因此 rsync 需要遍历所有年度文件以构建复制列表,而根本不需要它,因为我需要复制今天唯一的文件。截至 4 月,即使使用 --ignore-existing
选项也需要约 25 分钟。
如果可能的话,有人可以帮我创建一个脚本或其他任何东西来将当前年、月和日期添加到 cron 任务中的工作 rsync 路径吗?最终结果应该是这样的:
0 * * * * root rsync -rt --ignore-existing /myfiles/2020/04/26 user@myserver:/myfiles/2020/04/26
其中 /2020/04/26
是每天都在变化的可变部分。
我对 *nix 系统的经验非常有限,所以我觉得这是可能的,但基本上不知道如何开始。
要向路径添加实际日期,可以使用 date
实用程序或 bash shell.
中的内置 printf
使用date
echo "/myfiles/$(date +%Y/%m/%d)"
使用printf
echo "/myfiles/$(printf '%(%Y/%m/%d)T')"
在您使用内置 printf
的情况下,您需要在 cron 条目中将 shell 定义为 bash
。
0 * * * * root rsync -rt --ignore-existing "/myfiles/$(printf '\%(\%Y/\%m/\%d)T')" "user@myserver:/myfiles/$(printf '\%(\%Y/\%m/\%d)T')"
使用 date
要么定义 PATH
以包含 date
实用程序所在的位置,要么只使用绝对路径
0 * * * * root rsync -rt --ignore-existing "/myfiles/$(/bin/date +\%Y/\%m/\%d)" "user@myserver:/myfiles/$(/bin/date +\%Y/\%m/\%d)"
date
语法应该适用于 GNU 和 BSD 日期。
%
需要在 cron 条目中进行转义。
请参阅有关 cron(5)
的本地文档,了解如何添加 PATH 和 SHELL 变量。虽然 SHELL 通常可以是 SHELL=/bin/bash
和 PATH=/sbin:/bin:/usr/sbin:/usr/bin
的路径
我有一个每小时一次的 rsync cron 任务,用于将新文件添加到备份服务器。目录结构如下: /myfiles/year/month/date
其中年、月、日是文件的实际日期。 Cron 任务定义为 /etc/cron.d
问题是我必须指定一个 "root" /myfiles
目录,以使 rsync 每天都在备份位置复制我的文件夹结构。文件量很大 - 每天最多 1000 个文件,因此 rsync 需要遍历所有年度文件以构建复制列表,而根本不需要它,因为我需要复制今天唯一的文件。截至 4 月,即使使用 --ignore-existing
选项也需要约 25 分钟。
如果可能的话,有人可以帮我创建一个脚本或其他任何东西来将当前年、月和日期添加到 cron 任务中的工作 rsync 路径吗?最终结果应该是这样的:
0 * * * * root rsync -rt --ignore-existing /myfiles/2020/04/26 user@myserver:/myfiles/2020/04/26
其中 /2020/04/26
是每天都在变化的可变部分。
我对 *nix 系统的经验非常有限,所以我觉得这是可能的,但基本上不知道如何开始。
要向路径添加实际日期,可以使用 date
实用程序或 bash shell.
printf
使用date
echo "/myfiles/$(date +%Y/%m/%d)"
使用printf
echo "/myfiles/$(printf '%(%Y/%m/%d)T')"
在您使用内置 printf
的情况下,您需要在 cron 条目中将 shell 定义为 bash
。
0 * * * * root rsync -rt --ignore-existing "/myfiles/$(printf '\%(\%Y/\%m/\%d)T')" "user@myserver:/myfiles/$(printf '\%(\%Y/\%m/\%d)T')"
使用 date
要么定义 PATH
以包含 date
实用程序所在的位置,要么只使用绝对路径
0 * * * * root rsync -rt --ignore-existing "/myfiles/$(/bin/date +\%Y/\%m/\%d)" "user@myserver:/myfiles/$(/bin/date +\%Y/\%m/\%d)"
date
语法应该适用于 GNU 和 BSD 日期。%
需要在 cron 条目中进行转义。请参阅有关
的路径cron(5)
的本地文档,了解如何添加 PATH 和 SHELL 变量。虽然 SHELL 通常可以是SHELL=/bin/bash
和PATH=/sbin:/bin:/usr/sbin:/usr/bin