要清空可重复使用的输出文件夹,同时保留文件夹本身,请创建一个只删除其子项的 Mac 快捷指令。本指南使用固定文件夹、临时文本文件和一个会在清空前检查文件夹的 shell 脚本。

此任务是在每批生成文件之间重置一个文件夹。示例包括普通文件、名称中含空格的文件、隐藏文件和嵌套文件夹。脚本会直接删除这些内容,不会将它们移到废纸篓。Apple 发布的 rm 手册说明了递归删除和错误报告。Apple 的 rm 手册

决定清空后应保留什么

在此工作流程中,预期结果是原路径下仍有一个已存在的空文件夹。里面的任何子文件夹也属于输出,因此会连同其内容一起删除。如果你的输出目录中包含模板或需要永久保留的子文件夹结构,那么在使用此脚本之前,需要采用不同的选择规则。

示例目标文件夹是直接位于你的个人文件夹中的 Shortcut Output Demo。固定目标路径便于检查快捷指令:其行为不会受当前打开的 Finder 窗口或当前选中文件的影响。

要求 本指南中的行为
保留输出文件夹 仅将子路径传递给 rm
包含隐藏输出 Bash 的 dotglob 选项会包含以点号开头的名称
处理已为空的文件夹 接受空的子项列表
处理缺失的文件夹 停止并报错;不重新创建文件夹
删除嵌套输出 递归删除每个子文件夹
保留使用 Finder“放回原处”的能力 改用下方的 Finder 替代方法

如果你希望项目保留在废纸篓中,Finder 提供了一个实用的替代方法。打开输出文件夹,选中其中可丢弃的项目,然后按 Command-Delete。不要选中包含这些项目的文件夹。Apple 说明,移到废纸篓的项目会一直留在那里,直到清空废纸篓,并且可以通过 文件 > 放回原处 恢复。在 Mac 上删除文件和文件夹

为首次运行创建一个临时文件夹

打开“终端”,粘贴下面完整的设置代码块。它只会创建虚构的文本文件。必须先成功执行初始的 mkdir,之后才会写入任何文件,因此如果名为 Shortcut Output Demo 的文件或文件夹已存在,设置过程会停止,而不会重复使用其中的内容。

/bin/bash <<'BASH'
set -eu
target="$HOME/Shortcut Output Demo"

if ! /bin/mkdir "$target"; then
  printf 'Setup stopped: choose an unused demo folder name.\n' >&2
  exit 1
fi

/bin/mkdir "$target/Batch"
printf 'Synthetic output A\n' > "$target/alpha.txt"
printf 'Synthetic output B\n' > "$target/sample output.txt"
printf 'Synthetic marker\n' > "$target/.demo-marker"
printf 'Synthetic nested output\n' > "$target/Batch/nested.txt"
printf 'Created disposable examples in: %s\n' "$target"
BASH

在 Finder 中打开你的个人文件夹,找到 Shortcut Output Demo。其中有三个可见子项:alpha.txt、sample output.txt 和 Batch。第四个子项 .demo-marker 是故意设为隐藏的。Batch 中还有 nested.txt。这些都是用于示例的测试输入,不是现有用户文件。

如果设置过程因为名称已存在而停止,请保留那个已有项目。选择另一个未使用的演示名称,并在设置代码和清理脚本中都修改目标赋值,使其与新名称一致。不要为了绕过冲突而移除初始创建检查。

构建快捷指令并保留其输入和输出类型

在“快捷指令”中,点按添加按钮来创建快捷指令,并将其命名为 Clear Demo Output。在操作列表中搜索 Run Shell Script,然后添加该操作。Apple 说明了如何通过添加操作来创建快捷指令,以及如何按名称搜索操作列表。在 Mac 上创建自定义快捷指令、在 Mac 上浏览“快捷指令”的操作列表

将该操作的 Shell 设为 /bin/bash,然后用下面完整的清理脚本替换示例命令。此脚本使用 Bash 数组和 shopt,因此请保留该 shell 选项。脚本从其中的赋值语句读取目标路径;它不会接收快捷指令输入、标准输入或命令行参数。

如果脚本功能已停用,请选择 快捷指令 > 设置,打开“高级”,并启用“允许运行脚本”。Apple 说明了此设置用于从快捷指令运行脚本。Apple 的脚本运行设置

set -u
target="$HOME/Shortcut Output Demo"

if [[ ! -d "$target" || -L "$target" ]]; then
  printf 'Expected an existing ordinary folder: %s\n' "$target" >&2
  exit 1
fi

if [[ ! -r "$target" || ! -x "$target" ]]; then
  printf 'Cannot list the output folder.\n' >&2
  exit 1
fi

unset GLOBIGNORE
set +f
shopt -u failglob
shopt -s dotglob nullglob

items=( "$target"/* )
for item in "${items[@]}"; do
  if ! /bin/rm -R -- "$item"; then
    printf 'Clearing stopped; some items may remain.\n' >&2
    exit 1
  fi
done

remaining=( "$target"/* )
if (( ${#remaining[@]} != 0 )); then
  printf 'The folder still contains items.\n' >&2
  exit 1
fi

printf 'Folder is empty: %s\n' "$target"

操作成功时输出的是文本:以 Folder is empty: 开头的一行。它不是文件夹对象、已删除文件列表,也不是指向可重复使用目录的引用。如果之后扩展快捷指令,请明确地向任何需要文件夹的操作提供目标文件夹。Apple 的操作信息面板会标明可接受的输入和生成的输出;按住 Control 键点按操作图标,然后选取 Show Info 即可查看。查看操作的输入和输出信息

若要显示完成提示,请在脚本后添加 Show Alert,并将脚本的输出变量插入其消息中。Apple 说明了如何将上一个操作的输出传递给 Show Alert 进行检查。显示脚本的实际结果,比使用一条固定的“文件夹已空”消息更有用。在 Mac 快捷指令中使用“显示提醒”操作

了解文件夹为何会保留下来

赋值语句 items=( "$target"/* ) 会收集子路径。循环会将每个子项单独传递给 rm;它不会传递 "$target" 本身。因此,递归删除会作用于输出子文件夹,同时保留可重复使用的父文件夹。

两个 Bash 选项可以处理常见的重置问题。dotglob 会包含以点号开头的文件名,而 nullglob 会让不匹配的模式展开为空。带引号的数组展开会将含空格的文件名保留为独立参数。Apple 随附的 Bash 手册记录了这些行为。Bash 手册:路径名展开和数组

删除命令使用 -R 处理嵌套文件夹,并使用 -- 结束选项解析。脚本会检查每条命令的结果,并在失败时停止。Apple 的 rm 手册规定,发生错误时会返回非零退出状态。删除操作不是事务:如果删除后续子项时发生失败,先前已删除的子项不会恢复。Apple 的 rm 手册

脚本也会拒绝将符号链接作为目标。此示例仅适用于普通的本地输出文件夹,其中没有已挂载的宗卷。在清空之前,请停止所有生成输出的进程:运行期间或之后创建的文件可能导致文件夹无法保持为空。

验证首次运行和重复运行

使用编辑器中的运行按钮运行快捷指令。在修改目标路径之前,请按以下步骤检查结果。Apple 说明了如何在编辑器中测试自定义快捷指令。测试自定义快捷指令

  1. 确认 Shortcut Output Demo 仍显示在 Finder 中。
  2. 确认其中可见的示例文件和 Batch 文件夹已消失。
  3. 确认脚本返回了文件夹为空的消息;其最终检查也包括隐藏子项。
  4. 再次运行快捷指令。文件夹已经为空时,应显示相同的消息。
  5. 暂时重命名这个空的演示文件夹,然后再次运行。脚本应因目标文件夹不存在而停止并报错。之后恢复其名称。

清理脚本已通过 bash -n 语法检查。本文未在 macOS 的“快捷指令”中实际执行过该脚本,因此设置中仍需包含首次运行的临时测试步骤。

如果删除失败,请在重试前检查报告中提到的项目以及文件夹中剩余的内容。目标缺失、目录不可读和删除失败是不同的情况;脚本不会将它们伪装成成功消息。

重复使用文件夹,但不要假设会处理名称冲突

确认临时测试符合预期后,将目标赋值更改为你选定的输出文件夹。先检查其中的内容,并保持相同约定:其中所有内容都是可替换的输出,包括隐藏项目和子文件夹。

清空文件夹会删除当时已有的名称,但不会规定之后的导出或保存操作如何处理两个名称相同的新输出。请检查该操作自身的选项和说明,不要假设重置会启用替换、合并或自动重命名。Apple 可通过 Show Info 提供操作说明。检查操作的行为

你也可以使用下面的完整命令,从终端运行已保存的快捷指令。Apple 说明了如何为含空格的快捷指令名称加引号,并指出 shortcuts 命令成功时会返回 0,出错时会返回 1。从命令行运行快捷指令

shortcuts run "Clear Demo Output"

按明确的顺序清空并生成输出:完成上一批,清空选定的文件夹,检查结果,然后创建下一批。这样一来,可重复使用的文件夹用途明确,重复运行时也更可预测。

来源