适用于 macOS 的清理脚本

适用于 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 天的桌面文件和文件夹” ,并为所有用户清空垃圾箱!可以继续吗?”)。

答案1

自动清除垃圾

要为 $username 设置三十天自动垃圾箱删除选项:

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.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 作业每月执行该脚本。

相关内容