我有一堆与数十个用户共享的 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
,如下所示。
如果用户单击“是”,则对话框的退出代码为 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 作业每月执行该脚本。