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

blu*_*lds 0 shell macos

我希望定期运行一个脚本,该脚本仅将最近编辑的文件从一个目录复制到另一个目录。如何在 OSX 上使用 shell 脚本执行此操作?

ter*_*don 5

最简单的方法是直接通过cron. 例如,要每周复制一次文件,请像这样创建一个 crontab:

@weekly cp "$(ls -t /path/to/source | head -1)" /path/to/target
Run Code Online (Sandbox Code Playgroud)

细节:

-tls方式按时间排序,所以只打印第一个文件(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
Run Code Online (Sandbox Code Playgroud)

这将启动您的默认编辑器 ( $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)
Run Code Online (Sandbox Code Playgroud)

因此,例如,要cp /foo /bar在 10 月 12 日的 14:35运行,您可以这样写:

35    14   12      11    cp /foo /bar
Run Code Online (Sandbox Code Playgroud)

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 * * * *".
Run Code Online (Sandbox Code Playgroud)

所以,我上面给出的 crontab 意味着cp每周在周日早上的午夜运行一次命令。