删除超过 30 天的下载?
Delete downloads older than 30 days?
我正在尝试在 automator 中创建一个任务,将 ~/Downloads 中超过 30 天的文件移至垃圾箱。
我希望每天 运行 这个。
虽然它不起作用,Finder 只是挂起并停止响应,我必须从 activity 监视器强制退出它。
on run {input, parameters}
tell application "Finder"
set deleteFileList to (files of entire contents of folder alias "Macintosh HD:Users:George:Downloads" whose modification date is less than ((get current date)) - 30 * days)
try
repeat with deleteFile in deleteFileList
delete deleteFile
end repeat
end try
end tell
return input
end run
如果 Finder 挂起,这可能是因为 "entire contents" 中的文件太多。可能是某些下载的项目由包含子文件夹/子文件夹的文件夹组成,...然后文件太多。
相反,我建议您只查看下载文件夹的第一级:顶级项目:
Set DeleteFileList to every items of folder "Macintosh HD:Users:George:Downloads" whose modification date is less than ((get current date)) - 30 * days)
DeleteFileList 的内容将由文件和文件夹组成,但我猜您想删除整个文件夹,而不仅仅是其中的文件。
我会采取不同的方法并使用 Automator 中可用的一组 actions,而不使用 AppleScript.
以下工作流程 将完成您想要做的事情。
在 Automator 中,创建一个新的 Workflow 添加以下操作:
- 获取指定的查找器项目
- 将下载文件夹添加到其中。
- 获取文件夹内容
- [] 对找到的每个子文件夹重复
- 过滤查找器项目
- 在以下位置查找文件:
- 以下全部正确
- 上次修改日期不在最近 30 天内
- 将 Finder 项目移至废纸篓
将 Workflow 保存为 Application,例如:Cleanup Downloads.app
这应该 运行 比 AppleScript 版本快得多,它在我的测试中做到了。
Apple 的 安排此类事件的首选方法是使用 launchd
和 launchctl
.
到 运行 清理下载,我每天都会执行以下操作:
- 将 清理下载 添加到:系统偏好设置 > 安全与隐私 > 隐私 > 辅助功能
在以下位置创建用户 LaunchAgent:~/Library/LaunchAgents/
示例:com.me.cleanup.downloads.plist
作为 XML 文件包含:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.me.cleanup.downloads</string>
<key>ProgramArguments</key>
<array>
<string>/Applications/Cleanup Downloads.app/Contents/MacOS/Application Stub</string>
</array>
<key>RunAtLoad</key>
<false/>
<key>StartCalendarInterval</key>
<array>
<dict>
<key>Hour</key>
<integer>10</integer>
<key>Minute</key>
<integer>00</integer>
</dict>
</array>
</dict>
</plist>
根据您的需要,在 StartCalendarInterval
下设置 Hours
和 Minutes
的值。示例设置为:10:00AM
在终端运行下面的命令 加载 LaunchAgent:
launchctl load ~/Library/LaunchAgents/com.me.cleanup.downloads.plist
注意:请参阅终端中 launchd
和 launchctl
的手册页,例如man launchctl
或使用具有 GUI 的第三方实用程序,例如:Lingon X
注意:我与 Lingon X 的开发者无关,但我是一个满意的客户。
对您的 AppleScript code 的一些评论:
A repeat
语句不是必需的,只需使用:
move deleteFileList to trash
current date
命令在技术上在current application
下执行,而不是在Finder
下执行Finder不理解 current date
命令 。因此,设置一个变量并在命令中使用变量。
set thisDate to get (current date) - 30 * days
... whose modification date is less than thisDate
现在我并不是建议您实际使用 AppleScript 而不是我建议的 工作流程 ,我只是指出 代码 我不同意。
我正在尝试在 automator 中创建一个任务,将 ~/Downloads 中超过 30 天的文件移至垃圾箱。
我希望每天 运行 这个。
虽然它不起作用,Finder 只是挂起并停止响应,我必须从 activity 监视器强制退出它。
on run {input, parameters}
tell application "Finder"
set deleteFileList to (files of entire contents of folder alias "Macintosh HD:Users:George:Downloads" whose modification date is less than ((get current date)) - 30 * days)
try
repeat with deleteFile in deleteFileList
delete deleteFile
end repeat
end try
end tell
return input
end run
如果 Finder 挂起,这可能是因为 "entire contents" 中的文件太多。可能是某些下载的项目由包含子文件夹/子文件夹的文件夹组成,...然后文件太多。
相反,我建议您只查看下载文件夹的第一级:顶级项目:
Set DeleteFileList to every items of folder "Macintosh HD:Users:George:Downloads" whose modification date is less than ((get current date)) - 30 * days)
DeleteFileList 的内容将由文件和文件夹组成,但我猜您想删除整个文件夹,而不仅仅是其中的文件。
我会采取不同的方法并使用 Automator 中可用的一组 actions,而不使用 AppleScript.
以下工作流程 将完成您想要做的事情。
在 Automator 中,创建一个新的 Workflow 添加以下操作:
- 获取指定的查找器项目
- 将下载文件夹添加到其中。
- 获取文件夹内容
- [] 对找到的每个子文件夹重复
- 过滤查找器项目
- 在以下位置查找文件:
- 以下全部正确
- 上次修改日期不在最近 30 天内
- 以下全部正确
- 在以下位置查找文件:
- 将 Finder 项目移至废纸篓
将 Workflow 保存为 Application,例如:Cleanup Downloads.app
这应该 运行 比 AppleScript 版本快得多,它在我的测试中做到了。
Apple 的 安排此类事件的首选方法是使用 launchd
和 launchctl
.
到 运行 清理下载,我每天都会执行以下操作:
- 将 清理下载 添加到:系统偏好设置 > 安全与隐私 > 隐私 > 辅助功能
在以下位置创建用户 LaunchAgent:
~/Library/LaunchAgents/
示例:
com.me.cleanup.downloads.plist
作为 XML 文件包含:<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>Label</key> <string>com.me.cleanup.downloads</string> <key>ProgramArguments</key> <array> <string>/Applications/Cleanup Downloads.app/Contents/MacOS/Application Stub</string> </array> <key>RunAtLoad</key> <false/> <key>StartCalendarInterval</key> <array> <dict> <key>Hour</key> <integer>10</integer> <key>Minute</key> <integer>00</integer> </dict> </array> </dict> </plist>
根据您的需要,在
StartCalendarInterval
下设置Hours
和Minutes
的值。示例设置为:10:00AM
在终端运行下面的命令 加载 LaunchAgent:
launchctl load ~/Library/LaunchAgents/com.me.cleanup.downloads.plist
注意:请参阅终端中 launchd
和 launchctl
的手册页,例如man launchctl
或使用具有 GUI 的第三方实用程序,例如:Lingon X
注意:我与 Lingon X 的开发者无关,但我是一个满意的客户。
对您的 AppleScript code 的一些评论:
A repeat
语句不是必需的,只需使用:
move deleteFileList to trash
current date
命令在技术上在current application
下执行,而不是在Finder
下执行Finder不理解 current date
命令 。因此,设置一个变量并在命令中使用变量。
set thisDate to get (current date) - 30 * days
... whose modification date is less than thisDate
现在我并不是建议您实际使用 AppleScript 而不是我建议的 工作流程 ,我只是指出 代码 我不同意。