如何使用 Mac OS X 上的 shell 脚本从目录中仅复制一个文件(最新的文件)?

如何使用 Mac OS X 上的 shell 脚本从目录中仅复制一个文件(最新的文件)?

我希望定期运行一个脚本,该脚本仅将最近编辑的文件从一个目录复制到另一个目录。如何在 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将最新文件从 复制sourcetarget。表达式两边需要加引号,以便处理包含空格的文件名。

维基百科解释

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每周日凌晨午夜运行一次命令。

相关内容