Bash

macOS 的清理腳本

  • December 10, 2019

我有一堆與數十個使用者共享的 Mac 工作站。這些使用者經常將大文件留在桌面和垃圾箱中,最終填滿本地硬碟。我想建構一個基本的 shell 腳本,它將刪除超過設定天數的桌面文件和文件夾,並為所有使用者清空垃圾箱。到目前為止,這是我想出的:

# Delete desktop files and folders older than 30 days
sudo find /Users/*/Desktop/ -type d -or -type f ! -name '.DS_Store' ! 
-name '.localized' -mtime +30 -exec rm -rf '{}' +;

# Empty Trash for all users
rm -rf /Users/*/.Trash/*

我理解在這樣的腳本上出現語法錯誤的潛在危險。我已經測試了僅在我的帳戶上執行它(用我的使用者替換 *),雖然它似乎適用於文件,但我桌面上的舊文件夾沒有被刪除。我想知道我做錯了什麼,是否有更好的方法來執行此操作,並且可能會通過確認對話框添加一些修飾(即。“警告:這將永久刪除所有超過 30 天的桌面文件和文件夾,並為所有使用者清空資源回收筒!可以繼續嗎?”)。

自動清除垃圾

為 $username 設置 30 天自動垃圾箱清除選項:

sudo -u $username bash -c 'defaults write com.apple.finder FXRemoveOldTrashItems -bool true'

呈現對話框

請注意,要讓對話框部分在啟用 SIP 的 Mojave 上執行,每個使用者都需要在System Preferences> Security & Privacy> Privacy>中輸入一個條目,Automation以授予終端訪問權限System Events.app,從而顯示對話框。這是一個osascript如下所示的用法。

來自 shell 腳本的 macOS 或 OS X 對話框

如果使用者點擊“是”,則對話框的退出程式碼為 0(零)。可以將對話框成功退出程式碼的知識與腳本結合起來,如下所示。

#!/usr/bin/env bash
osascript -e 'tell app "System Events" to display dialog "Hi. I am automated script. May I delete Desktop & Trash files older than 30 days?" buttons {"Yes", "No"} with icon caution' >/dev/null 2>&1 

# $? is the exit code of the very last command that was executed (osascript).
#
if [ $? -eq 0 ]; then
   # Do something.
   echo "You clicked Yes."
fi

查找文件

.DS_Store下面,查找名稱不是或.localized30 天以上的特定類型(文件和目錄)的文件。第一行用於安全測試。與它下面的行交換以刪除找到的對象。如果需要多次指定一個選項,請使用-o. 請務必轉義 ( \) 特殊字元。括號開頭和結尾的空格也很重要。

#!/usr/bin/env bash
find "$HOME/Desktop" -type f -o -type d -mtime +30 \! \( -name '.DS_Store' -o -name '.localized' \) -print
# find "$HOME/Desktop" -type f -o -type d -mtime +30 \! \( -name '.DS_Store' -o -name '.localized' \) -exec rm -rf '{}' +

列出使用者

#!/usr/bin/env bash
# Getting a list of users, filtering out service accounts, root, daemon, and nobody...
users=$(dscl . list /Users | grep -v -e '_' -e 'root' -e 'daemon' -e 'nobody')

for user in "$users"; do
   # Do something.
   id "$user"
done

unset users

顯然,為了將這些片段拼接成一個工作腳本,需要做一些插值,但我希望它至少能提供更多的洞察力。如果是我,我想我可能會嘗試保留腳本,/usr/local/bin然後設置一個 cron 作業來每月執行腳本。

引用自:https://unix.stackexchange.com/questions/494910