Я пытаюсь периодически запускать скрипт, который копирует только один последний отредактированный файл из одного каталога в другой. Как мне сделать это с помощью сценария оболочки на OSX?
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 позволяет пользователям планировать выполнение заданий (команд или сценариев оболочки) периодически в определенное время или даты. Обычно используется для автоматизации обслуживания или администрирования системы.
[...]
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
раз в неделю в полночь в воскресенье утром.