Используйте «Команды» на Mac, чтобы передать текст скрипту оболочки, который выберет самый недавно изменённый текстовый файл в одной локальной папке и добавит в него вашу запись. В этом руководстве используются временные примеры файлов; процесс остановится, если папка пуста или время изменения самого нового файла совпадает со временем изменения другого файла.
Задача здесь конкретная: добавлять короткую запись в существующий текстовый файл без необходимости каждый раз выбирать его вручную. Apple документирует поддержку скриптов оболочки в «Командах» на Mac. Приведённый ниже порядок действий сочетает эту поддерживаемую возможность с документированными средствами zsh для выбора файлов и добавления текста. Знакомство с «Командами» для macOS
Определите, что означает «самый новый файл»
В этой статье самым новым считается файл, изменённый последним. Скрипт рассматривает только видимые обычные файлы с именами, оканчивающимися на строчные .txt, непосредственно в указанной папке. Подпапки и символические ссылки исключаются. Эти правила выбора основаны на шаблонах имён файлов и квалификаторах zsh. Подстановка
Это определение влияет на повторные запуски. После добавления текста в файл время его изменения обновляется, поэтому обычно он и дальше будет самым новым подходящим файлом. Если вы хотите работать с последним созданным документом, время изменения — другое правило; не предполагайте, что этот процесс выбирает файлы по дате создания.
Прежде чем создавать команду, выберите правило, соответствующее вашей задаче:
| Ваша задача | Подходит ли этот пример? |
|---|---|
Добавлять текст в последний изменённый файл .txt |
Да |
| Добавлять текст в файл с самой поздней датой в имени | Нет; даты в именах файлов не распознаются |
| Добавлять текст в последний созданный файл | Нет; время создания не используется |
| Включать файлы из подпапок | Нет; поиск ограничен одной папкой |
| Добавлять текст в документ с форматированием или PDF | Нет; в этом примере записывается обычный текст |
Finder поможет визуально проверить результат. Откройте папку в виде списка и нажмите заголовок столбца Дата изменения; при необходимости нажмите его ещё раз, чтобы сначала отображался последний изменённый элемент. Apple документирует сортировку по столбцам и изменение её порядка. Отображение в Finder помогает проверить результат, но скрипт выбирает файл самостоятельно. Сортировка и упорядочивание объектов в Finder на Mac
Создайте временную папку для примера
В примере используется папка Shortcut Append Demo в домашней папке. Настройка намеренно прекращается, если папка с таким именем уже существует, вместо повторного использования её содержимого. Будут созданы два искусственных текстовых файла с интервалом в две секунды, чтобы время изменения второго файла было более поздним.
Откройте Терминал, вставьте весь блок настройки и нажмите Return. Команды в заключённом в кавычки heredoc выполняются в отдельном процессе zsh, поэтому при ошибке настройки этот процесс завершится.
/bin/zsh <<'ZSH'
emulate -L zsh
setopt ERR_EXIT
folder="$HOME/Shortcut Append Demo"
if ! /bin/mkdir "$folder"; then
printf '%s\n' 'Setup stopped: use a new folder name if this one exists.' >&2
exit 1
fi
printf '%s\n' 'Sample entry: blue notebook.' > "$folder/older.txt"
/bin/sleep 2
printf '%s\n' 'Sample entry: green notebook.' > "$folder/newer.txt"
printf 'Example folder: %s\n' "$folder"
ZSH
При настройке перенаправление вывода создаёт файлы только после успешного создания новой папки. Apple различает обычное перенаправление вывода, которое записывает результат команды в файл, и перенаправление с добавлением, которое дописывает результат в конец файла. Перенаправление ввода и вывода Терминала на Mac
Если настройка сообщает, что папка уже существует, выберите другое временное имя и измените присваивание папки и в настройке, и в скрипте команды ниже. Не запускайте отдельные строки записи файлов для уже существующей папки.
Создайте команду и сохраните текстовый ввод
Создайте новую команду в приложении «Команды» и назовите её Append to Newest Text File. Найдите в списке действий перечисленные ниже действия и добавьте их. Apple документирует поиск в библиотеке действий и проверку принимаемого каждым действием ввода и результирующего вывода с помощью Показать сведения. Навигация по списку действий в приложении «Команды» на Mac
- Добавьте действие
Текстс искусственной записьюSample entry: orange notebook. - Сразу после него добавьте действие
Выполнить скрипт оболочки. - Выберите оболочку
/bin/zsh. - В качестве ввода скрипта укажите вывод предыдущего действия
Текст. - Для параметра
Передавать вводвыберитекак аргументы. - Замените содержимое поля скрипта полным текстом из следующего раздела.
Ожидаемая связь: одно значение «Текст» передаётся как один аргумент скрипта. Скрипт читает этот аргумент как $1. При успешном выполнении он выводит текстовое подтверждение с путём назначения; этот путь не является объектом «Файл» в «Командах», а вывод не содержит полный текст файла.
Не отключайте связь с выводом действия Текст. Если передать файл, список имён файлов или посторонний ввод команды, скрипт получит другие данные. Скрипт проверяет количество аргументов, чтобы неожиданный набор входных данных не превратился в несколько добавленных записей.
Если скрипты отключены, откройте «Команды» > «Настройки», выберите Дополнительно и включите Разрешить запуск скриптов. Apple документирует эти настройки для разрешения запуска скриптов в командах. Инструкции Apple по настройке скриптов
Добавьте скрипт для выбора файла и записи
Вставьте всю эту программу в действие Выполнить скрипт оболочки. Загружать дополнительные инструменты или создавать отдельный файл скрипта не нужно. Присваивание папки соответствует временной настройке выше.
emulate -L zsh
unsetopt CLOBBER APPEND_CREATE
fail() {
printf '%s\n' "$1" >&2
exit 1
}
(( $# == 1 )) || fail 'Expected exactly one text input.'
[[ -n "$1" ]] || fail 'The text input is empty.'
folder="$HOME/Shortcut Append Demo"
[[ -d "$folder" ]] || fail 'The example folder does not exist.'
files=( "$folder"/*.txt(N.om) )
(( ${#files} > 0 )) || fail 'No eligible .txt files were found.'
newest="${files[1]}"
if (( ${#files} > 1 )); then
[[ "$newest" -nt "${files[2]}" ]] ||
fail 'The newest timestamp is tied or the folder changed. Check the files.'
fi
[[ -f "$newest" && ! -L "$newest" ]] ||
fail 'The selected file is no longer an eligible regular file.'
[[ -w "$newest" ]] || fail 'The selected file is not writable.'
if ! printf '\n%s\n' "$1" >> "$newest"; then
fail 'Append failed; inspect the selected file before retrying.'
fi
printf 'Appended to: %s\n' "$newest"
Выражение выбора формирует массив путей к совпадающим файлам. В (N.om) параметр N разрешает отсутствие совпадений, . ограничивает выбор обычными файлами, а om сортирует их по времени изменения, помещая самый новый первым. Массив предотвращает разделение путей по пробелам в именах файлов. Подстановка
Следующая проверка требует, чтобы первый файл был строго новее второго. Если время их изменения совпадает, команда останавливается, а не выбирает один из них без предупреждения. В документации zsh описан оператор -nt для сравнения возраста файлов, а также используемые здесь проверки на обычный файл, символическую ссылку и возможность записи. Условные выражения
Команда добавления использует фиксированный формат printf и передаёт вашу запись как аргумент %s. Поэтому знаки процента и обратные косые черты в записи воспринимаются как текст, а не как дополнительные инструкции форматирования. Начальный символ новой строки отделяет запись от существующего текста; завершающий символ новой строки завершает её. Если файл уже заканчивается символом новой строки, между записями появится пустая строка. Встроенные команды оболочки
Скрипт также снимает параметры CLOBBER и APPEND_CREATE. Согласно документации zsh, если оба параметра не установлены, перенаправление с добавлением завершится ошибкой, когда файла назначения не существует. Это важно, если выбранный файл исчезнет до записи: скрипт должен сообщить об ошибке, а не создавать новый файл по прежнему пути. Перенаправление
Проверьте результат на примерах файлов
Запустите команду один раз. Если содержимое временной папки не менялось, ожидаемое место назначения — newer.txt. Откройте этот файл и проверьте, что в нём следующее содержимое. Это ожидаемый результат, полученный на основе примера, а не утверждение о проведённом тесте в интерфейсе Mac.
Sample entry: green notebook.
Sample entry: orange notebook.
Также откройте older.txt. В нём должна остаться только запись Sample entry: blue notebook. Проверка обоих файлов подтверждает две части задачи: выбор одного места назначения и сохранность второго файла.
Попробуйте добавить вторую искусственную запись: измените действие Текст на Sample entry: yellow notebook. и запустите команду ещё раз. Если другой подходящий файл не стал новее, ожидайте ещё одну запись с пустой строкой между ними в newer.txt. При двух запусках команды с одним и тем же вводом этот текст будет добавлен дважды; программа не ищет дубликаты.
Эти примеры были сверены с документацией, но не запускались здесь: в доступной среде нет ни «Команд» для macOS, ни zsh. Прежде чем изменять присваивание папки, проверьте работу на временных файлах на своём Mac.
Пустые папки, конфликты имён и изменения файлов
Для работы нужен существующий файл назначения. Если папка отсутствует или пуста либо в ней есть только неподходящие элементы, перед добавлением текста возникнет ошибка. Скрипт не создаёт файл по умолчанию, не выбирает подпапку и не переключается на документ с другим именем.
Конфликтов имён удаётся избежать, потому что скрипт вообще не создаёт файл назначения. Настройка останавливается, если папка уже существует. При обычных запусках команды выбранный файл сохраняет прежнее имя: скрипт не переименовывает его и не создаёт вторую копию. Поведение при отсутствии файла регулируется документированными параметрами добавления zsh. Перенаправление
Если результат не совпадает с ожиданиями, выполните эту короткую диагностическую последовательность:
- Проверьте присваивание папки. Оно должно соответствовать папке, созданной при настройке.
- Проверьте условия выбора. Образец включает видимые обычные файлы со строчными
.txtв конце имени, находящиеся на верхнем уровне папки. - Проверьте порядок по времени изменения. Посмотрите столбец
Дата измененияв Finder, помня, что после изменения файла он может стать следующим местом назначения. - Проверьте совпадение времени. Измените и сохраните нужный файл позднее, затем проверьте порядок ещё раз.
- Проверьте связь действий. В оболочку должно передаваться одно текстовое значение в качестве одного аргумента.
Скрипт рассчитан на папку, содержимое которой не меняется во время выполнения. Выбор файла и запись — отдельные операции: другой процесс может изменить, заменить или добавить файл между ними. Эти проверки не делают процесс атомарным, а ошибка записи может оставить частично добавленную запись. Если добавление завершилось ошибкой, проверьте файл, прежде чем повторять попытку.
Когда подходят встроенные фильтры файлов
Apple описывает Фильтровать файлы как действие, которое принимает содержимое, сужает выбор с помощью фильтров и передаёт дальше совпадающие результаты. Общие настройки фильтра позволяют сортировать результаты и ограничивать их количество. Эти операции помогают выбрать файл, но сами по себе не добавляют текст. Знакомство с действиями поиска и фильтрации, Добавление параметров фильтра
В этом руководстве выбор файла и запись объединены в скрипте оболочки, чтобы шаблон файла, поведение при совпадении времени и требование к существующему файлу были указаны явно. Если вы создаёте другую цепочку действий с файлами, сначала ознакомьтесь с Показать сведения для каждого действия: результат типа «Файл», содержимое файла, преобразованное в текст, и путь, представленный текстом, — это разные значения. Apple описывает действия именно для того, чтобы указать типы вводимых и получаемых данных. Навигация по списку действий в приложении «Команды» на Mac
Убедившись, что пример работает как ожидается, сохраняйте те же чёткие условия и при адаптации: одна текстовая запись, одна указанная локальная папка и один строго самый новый подходящий файл. Так каждый запуск будет предсказуемым, и вы будете знать, где искать причину, если команда остановится.
Источники
- Знакомство с «Командами» для macOS — Apple Developer.
- Навигация по списку действий в приложении «Команды» на Mac — Служба поддержки Apple.
- Дополнительные настройки конфиденциальности и безопасности в приложении «Команды» на Mac — Служба поддержки Apple.
- Сортировка и упорядочивание объектов в Finder на Mac — Служба поддержки Apple.
- Перенаправление ввода и вывода Терминала на Mac — Служба поддержки Apple.
- Знакомство с действиями поиска и фильтрации в приложении «Команды» на Mac — Служба поддержки Apple.
- Добавление параметров фильтра к действиям поиска и фильтрации в приложении «Команды» на Mac — Служба поддержки Apple.
- 14 Подстановка — Группа разработчиков Zsh.
- 12 Условные выражения — Группа разработчиков Zsh.
- 17 Встроенные команды оболочки — Группа разработчиков Zsh.
- 7 Перенаправление — Группа разработчиков Zsh.