Я пытаюсь периодически запускать скрипт, который копирует только один последний отредактированный файл из одного каталога в другой. Как мне сделать это с помощью сценария оболочки на OSX?

1 ответ1

4

Самый простой способ - сделать это напрямую через 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 позволяет пользователям планировать выполнение заданий (команд или сценариев оболочки) периодически в определенное время или даты. Обычно используется для автоматизации обслуживания или администрирования системы.

[...]

Cron управляется файлом crontab (таблица cron), файлом конфигурации, который задает команды оболочки для периодического запуска по заданному расписанию.

Чтобы создать новый 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 в 14:35 12 октября, вы должны написать:

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 раз в неделю в полночь в воскресенье утром.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .