若要清空可重複使用的輸出資料夾,同時保留資料夾本身,請建立一個只移除其子項目的 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 Alert,並將指令碼的輸出變數插入訊息中。Apple 說明了如何將先前動作的輸出傳入 Show Alert 以供檢視。顯示指令碼實際結果,比起固定顯示「資料夾是空的」的訊息更實用。在 Mac 上的捷徑中使用 Show Alert 動作

了解為何資料夾會保留下來

指定值 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 Bash 語法檢查。本文尚未在 macOS「捷徑」中實際執行此指令碼,因此首次執行時仍需依照設定步驟使用可丟棄資料夾。

如果移除失敗,請先檢查回報的項目和資料夾中剩餘的內容,再重試。不存在的目標、無法讀取的目錄,以及移除失敗是不同情況;指令碼不會將它們轉成成功訊息。

重複使用資料夾,但不要假設它會處理名稱衝突

確認可丟棄資料夾測試結果符合預期後,將目標指定值改為你選定的輸出資料夾。先檢查其中的內容,並維持相同的前提:裡面所有項目都是可替換的輸出內容,包括隱藏項目和子資料夾。

清空資料夾會移除當下已存在的名稱。這並不能決定稍後的匯出或儲存動作,遇到兩個新輸出檔案名稱相同時會如何處理。請檢查該動作自己的選項和說明,不要假設這次重設會啟用取代、合併或自動重新命名。Apple 可透過 顯示資訊 提供動作說明。檢查動作的行為

你也可以使用以下完整指令,從終端機執行已儲存的捷徑。Apple 說明了如何為含空格的捷徑名稱加上引號,並指出 shortcuts 指令成功時會傳回 0,發生錯誤時則會傳回 1。從命令列執行捷徑

shortcuts run "Clear Demo Output"

請依照明確的順序清空和產生輸出:完成上一批、清空選定的資料夾、確認結果,然後再建立下一批。這樣可讓可重複使用的資料夾用途明確,也能讓重複執行的結果更可預期。

來源