使用 Mac 快捷指令将文本传递给 Shell 脚本,该脚本在一个本地文件夹中选择最近修改的文本文件并追加您的条目。本演示使用一次性示例文件,如果文件夹为空或最新时间戳相同则停止。

这里的任务很具体:向现有的纯文本文件添加简短条目,而无需每次手动选择该文件。Apple 文档支持在 Mac 快捷指令中使用 Shell 脚本。以下工作流将该受支持的功能与有据可查的 zsh 文件选择和追加行为相结合。了解 macOS 快捷指令

确定“最新文件”的含义

本文将“最新”定义为最近修改过。脚本仅考虑直接位于指定文件夹中、名称以小写 .txt 结尾的可见常规文件。它排除子文件夹和符号链接。这些选择规则来自 zsh 的文件名模式和限定符。扩展

该定义影响重复运行。向文件追加内容后,其修改时间会改变,因此它通常仍是最新的合格文件。如果您的意图是跟踪最新创建的文档,修改时间是另一条规则;请勿假设此工作流实现了基于创建日期的选择。

构建快捷指令前,选择与您的任务匹配的规则:

您的预期任务 本示例是否匹配?
向最近编辑的 .txt 文件追加内容 是
向文件名中日期最新的文件追加内容 否;不将文件名解释为日期
向最近创建的文件追加内容 否;不使用创建时间
包含子文件夹内的文件 否;选择仅限于一个文件夹
向富文本文档或 PDF 追加内容 否;本示例写入纯文本

访达提供了有用的视觉检查。在列表视图中打开文件夹并点击 修改日期 列标题;如有必要再次点击以将最新项目置于顶部。Apple 文档记录了列排序和反转顺序。访达的显示有助于您检查结果,但脚本会执行自己的选择。在 Mac 上的访达中排序和排列项目

创建一次性示例文件夹

示例使用您主文件夹中名为 Shortcut Append Demo 的文件夹。设置特意在该名称已存在时停止,而不是复用其内容。它创建两个合成文本文件,间隔两秒,因此第二个文件应具有较晚的修改时间。

打开终端,粘贴此完整设置块,然后按返回键。带引号的 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 终端中重定向输入和输出

如果设置报告文件夹已存在,请选择另一个一次性名称,并在下方的设置和快捷指令脚本中更改文件夹赋值。请勿对现有文件夹重新运行单个文件写入行。

构建快捷指令并保留文本输入

在快捷指令 App 中创建新快捷指令,命名为 Append to Newest Text File。使用动作搜索添加下方的动作。Apple 文档记录了搜索动作库以及通过 显示信息 检查每个动作接受的输入和产生的输出。在 Mac 上的快捷指令中浏览动作列表

  1. 添加一个包含合成条目 Sample entry: orange notebook. 的 文本 动作。
  2. 紧随其后添加 运行 Shell 脚本。
  3. 将 Shell 设置为 /bin/zsh。
  4. 将脚本的输入设置为前一个 文本 动作的输出。
  5. 将 传递输入 设置为 作为参数。
  6. 用下一节中的完整脚本替换脚本字段。

预期的连接是一个文本值传入一个脚本参数。脚本将该参数作为 $1 读取。其成功输出是一个包含目标路径的文本确认信息;该路径不是快捷指令文件对象,输出也不是文件的完整内容。

保持输入连接到 文本 输出。传递文件、文件名列表或快捷指令的无关输入会改变到达脚本的内容。脚本检查参数数量,以免意外的输入集合变成多个追加条目。

如果脚本被禁用,请打开 快捷指令 > 设置,选择 高级,并启用 允许运行脚本。这些是 Apple 文档记录的允许快捷指令中运行脚本的控制项。Apple 的脚本设置说明

添加选择和追加的脚本

将此完整程序粘贴到 运行 Shell 脚本 中。它不需要下载工具或单独的脚本文件。文件夹赋值与上述一次性设置匹配。

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 参数提供。因此,条目中的百分号和反斜杠被视为文本,而非额外的格式指令。初始换行将条目与现有文本分隔;末尾换行终止条目。如果文件已以换行结尾,这会在条目之间产生一个空行。Shell 内置命令

脚本还取消设置 CLOBBER 和 APPEND_CREATE。zsh 文档指出,当这两个选项均未设置时,如果目标不存在,追加重定向会失败。如果选定文件在追加前消失,这很重要:脚本应报告失败,而不是在旧路径创建替代文件。重定向

使用示例文件检查结果

运行一次快捷指令。使用未修改的示例文件夹,预期目标是 newer.txt。打开该文件并检查以下内容。这是从示例推导出的预期结果,而非已完成的 Mac UI 测试声明。

Sample entry: green notebook.

Sample entry: orange notebook.

也打开 older.txt。它应仍仅包含 Sample entry: blue notebook. 检查两个文件可验证任务的两部分:选择一个目标并保留另一个文件。

尝试第二个合成条目:将 文本 动作改为 Sample entry: yellow notebook. 并再次运行。如果没有其他合格文件变得更新,预期在 newer.txt 中会有另一个分隔的条目。使用相同输入运行两次快捷指令会追加该输入两次;此程序不检测重复条目。

这些示例经文档核对但未在此执行:可用环境既无 macOS 快捷指令也无 zsh。在调整文件夹赋值前,请在您的 Mac 上完成一次性文件检查。

理解空文件夹、冲突和变更中的文件

工作流需要现有目标。不存在的文件夹、空文件夹或仅包含不合格项目的文件夹会在追加前产生错误。它不会创建默认文件、选择子文件夹或回退到不同名称的文档。

名称冲突通过完全避免创建目标来处理。设置在文件夹名称已存在时停止。正常快捷指令运行期间,选定文件保持其当前名称:脚本既不重命名也不保存第二个副本。单独的缺失文件行为由文档记录的 zsh 追加选项控制。重定向

如果结果与预期不同,请使用此小型诊断序列:

  1. 检查文件夹赋值。 必须与设置期间创建的文件夹匹配。
  2. 检查合格性。 示例模式包含文件夹顶层可见的、以小写 .txt 结尾的常规文件。
  3. 检查修改顺序。 在访达中检查 修改日期,记住编辑文件会使其成为下一个目标。
  4. 检查时间戳相同的情况。 稍后编辑并保存预期的示例文件,然后再次检查顺序。
  5. 检查动作连接。 一个文本值必须作为一个参数到达 Shell。

脚本旨在用于运行期间保持不变的文件夹。选择和写入是分离的操作:另一个进程可能在两者之间编辑、替换或添加文件。检查不会将工作流变为事务,写入失败可能留下部分追加的条目。追加错误后请在重试前检查文件。

原生文件筛选器的适用位置

Apple 文档记录 筛选文件 为一个接受内容、使用筛选器缩小范围并传递匹配结果的动作。其通用筛选控件可对结果排序并限制数量。这些操作有助于选择文件;它们本身不追加文本。“查找” 和“筛选” 动作简介,添加筛选参数

本演示将选择和写入保留在 Shell 脚本中,以便文件模式、相同时间戳行为和现有文件要求显式化。如果您使用文件动作构建不同的链,请先检查每个动作的 显示信息:文件结果、转换为文本的文件内容和作为文本表示的路径是不同的值。Apple 专门提供这些动作描述以识别输入和输出类型。在 Mac 上的快捷指令中浏览动作列表

示例按预期工作后,调整时保持相同的清晰契约:一个文本条目、一个指定的本地文件夹和一个严格最新的合格文件。这使每次运行可预测,并在快捷指令停止时给您一个具体的调查位置。

来源