这是我使用的脚本:
find /path/backups/ -type f -mtime -2 -printf '%P\n' | rsync -avz --progress --delete --exclude-from=- -e "ssh -p 512" /path/backups/ me@host:/remote/path/server-backups/
这是来自日志的内容:
> Jan 21 15:32:01 servername CRON[14654]: (serveruser) CMD (find /path/backups/ -type f -mtime -2 -printf ')
我尝试过使用cron.d
、crontab -e
和cron.daily
。 既可以将脚本直接放入crontab
文件中,也可以调用.sh
脚本文件。 有什么想法可以解决这个问题吗?
答案1
该命令被截断,因为%
在 中具有特殊含义cron
。来自man 5 crontab
:
The ``sixth'' field (the rest of the line) specifies the command to be
run. The entire command portion of the line, up to a newline or %
character, will be executed by /bin/sh or by the shell specified in the
SHELL variable of the crontab file. Percent-signs (%) in the command,
unless escaped with backslash (\), will be changed into newline charac‐
ters, and all data after the first % will be sent to the command as
standard input. There is no way to split a single command line onto
multiple lines, like the shell's trailing "\".
这解释了为什么记录的命令看起来像这样:
CMD (find /home/steeldriver/forums/tests -type f -mtime +1 -printf ')
为了证明转义有效,给出:
$ ls -l tests
total 12
-rw-rw-r-- 1 steeldriver steeldriver 0 Jan 22 14:22 A8eVAmK.txt
-rw-rw-r-- 1 steeldriver steeldriver 22 Oct 27 22:18 A9E27.txt
-rw-rw-r-- 1 steeldriver steeldriver 10 Oct 27 22:19 ffn2eG6.txt
-rw-rw-r-- 1 steeldriver steeldriver 43 Jan 22 14:22 sBHFgkv.txt
然后添加 crontab 如下:
* * * * * find /home/steeldriver/forums/tests -type f -mtime +1 -printf '\%P\0' | rsync -0av --exclude-from=- /home/steeldriver/forums/tests/ /home/steeldriver/forums/newtests/ 2>&1 > /home/steeldriver/forums/backup.log
(注意,这使用以空字符结尾的形式\0
)生成日志文件:
$ cat backup.log
sending incremental file list
created directory /home/steeldriver/forums/newtests
./
A8eVAmK.txt
sBHFgkv.txt
sent 250 bytes received 113 bytes 726.00 bytes/sec
total size is 43 speedup is 0.12
表明备份已成功运行并且仅复制了较新的文件:
$ ls -l newtests
total 4
-rw-rw-r-- 1 steeldriver steeldriver 0 Jan 22 14:22 A8eVAmK.txt
-rw-rw-r-- 1 steeldriver steeldriver 43 Jan 22 14:22 sBHFgkv.txt
请注意,您无法在 crontab 之外测试转义 - 在终端中,它将导致错误 find
。
答案2
我建议采用另一种方法。使用临时文件可以让你的生活更轻松,并帮助你避免使用可能导致 cron 作业出现问题的管道。
这个过程相当简单。首先发出命令
find ./ -daystart -mtime +2 >myfile
笔记:
上面的命令将匹配 2 到 3 天的文件,因为它使用整数天数。*根据需要进行修改,或使用 -mmin 和分钟进行更准确的选择。匹配结果将写入文件 myfile,每次运行命令时都会被覆盖。
接下来发出命令:
sed 's|./||' myfile >EXCL_list
删除不需要的前缀。每次运行该命令时,文件 EXCL_list 都会被覆盖。
最后发出命令:
rsync -Pav --exclude-from=EXCL_list --delete-excluded source/ dest
rsync开关说明:
-P
与 --partial --progress 相同
-a
存档模式
-v
冗长
--exclude-from=EXCL_list
从文件中读取排除模式
--delete-excluded
也删除排除文件来自目标目录
如需了解更多详细信息和更多选项,请参阅man rsync
假设:
命令在包含您要处理的文件和文件夹的源目录中运行。
rsync 命令中的 dest 是您有写入权限的挂载目标。
希望这能有所帮助。
资料来源:
http://www.linuxquestions.org/questions/linux-general-1/rsync-only-60-day-old-files-580357
https://serverfault.com/questions/279609/what-exactly-will-delete-excluded-do-for-rsync
man find
man rsync