删除超过 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 的 安排此类事件的首选方法是使用 launchdlaunchctl.

到 运行 清理下载,我每天都会执行以下操作:

  1. 清理下载 添加到:系统偏好设置 > 安全与隐私 > 隐私 > 辅助功能
  2. 在以下位置创建用户 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 下设置 HoursMinutes 的值。示例设置为:10:00AM

  3. 终端运行下面的命令 加载 LaunchAgent:

    launchctl load ~/Library/LaunchAgents/com.me.cleanup.downloads.plist
    

注意:请参阅终端中 launchdlaunchctl 的手册页,例如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 而不是我建议的 工作流程 ,我只是指出 代码 我不同意。