我希望定期运行一个脚本,该脚本仅将最近编辑的文件从一个目录复制到另一个目录。如何在 OSX 上使用 shell 脚本执行此操作?
答案1
最简单的方法是直接通过cron
。例如,每周复制一次文件,创建如下 crontab:
@weekly cp "$(ls -t /path/to/source | head -1)" /path/to/target
细节:
标志-t
表示ls
按时间排序,因此通过仅打印第一个文件(head -1
),我知道我获取的是最新的文件。运行ls -t /path/to/source | head -1
将返回目录中的最新文件/path/to/source
,因此cp "$(ls -t /path/to/source | head -1)" /path/to/target
将最新文件从 复制source
到target
。表达式两边需要加引号,以便处理包含空格的文件名。
维基百科解释那
Cron 是类 Unix 计算机操作系统中基于时间的作业调度程序。Cron 使用户能够安排作业(命令或 shell 脚本)在特定时间或日期定期运行。它通常用于自动化系统维护或管理。
[...]
Cron 由 crontab(cron 表)文件驱动,该文件是一个配置文件,指定按照给定的时间表定期运行的 shell 命令。
要创建新的 crontab,请打开终端并运行
crontab -e
这将启动您的默认编辑器 ( $EDITOR
) 并向您显示一个文本文件。将上面的行粘贴到该文件中,保存并退出,这样您的 crontab 就创建好了。
crontabs 的格式如下(取自这里):
* * * * * command to be executed
- - - - -
| | | | |
| | | | +----- day of week (0 - 6) (Sunday=0)
| | | +------- month (1 - 12)
| | +--------- day of month (1 - 31)
| +----------- hour (0 - 23)
+------------- min (0 - 59)
因此,例如,要cp /foo /bar
在 10 月 12 日 14:35 运行,您可以编写:
35 14 12 11 cp /foo /bar
该cron
守护进程还可以理解一些简写命令,例如:
string meaning
------ -------
@reboot Run once, at startup.
@yearly Run once a year, "0 0 1 1 *".
@annually (same as @yearly)
@monthly Run once a month, "0 0 1 * *".
@weekly Run once a week, "0 0 * * 0".
@daily Run once a day, "0 0 * * *".
@midnight (same as @daily)
@hourly Run once an hour, "0 * * * *".
所以,我上面给出的 crontab 意味着cp
每周日凌晨午夜运行一次命令。