macOS 的清理腳本
我有一堆與數十個使用者共享的 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
如下所示的用法。如果使用者點擊“是”,則對話框的退出程式碼為 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
下面,查找名稱不是或.localized
30 天以上的特定類型(文件和目錄)的文件。第一行用於安全測試。與它下面的行交換以刪除找到的對象。如果需要多次指定一個選項,請使用-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 作業來每月執行腳本。