Macos 是否删除超过30天的下载?

Macos 是否删除超过30天的下载?,macos,automation,applescript,automator,Macos,Automation,Applescript,Automator,我正在尝试在automator中创建一个任务,如果~/下载中的文件超过30天,则将其移动到垃圾箱 我想让它每天运行 但它不工作,Finder只是挂起并停止响应,我不得不从活动监视器中强制退出它 on run {input, parameters} tell application "Finder" set deleteFileList to (files of entire contents of folder alias "Macintosh HD:Users:Geo

我正在尝试在automator中创建一个任务,如果~/下载中的文件超过30天,则将其移动到垃圾箱

我想让它每天运行

但它不工作,Finder只是挂起并停止响应,我不得不从活动监视器中强制退出它

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挂起,这可能是因为“整个内容”中的文件太多。可能是某些下载的项目由带有子文件夹/子文件夹的文件夹组成,。。。然后是太多的文件

相反,我建议您只查看下载文件夹的第一级:项目顶级:

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中提供的一组操作,而不必使用AppleScript

以下工作流将完成您希望完成的任务

在自动化程序中创建新的工作流,添加以下操作:

  • 获取指定的查找程序项
    • 将下载文件夹添加到其中
  • 获取文件夹内容
    • []对找到的每个子文件夹重复此操作
  • 筛选查找项
    • 在以下位置查找文件:
      • 以下所有情况都是正确的
        • 上次修改日期不在最近30天内
  • 将查找器项目移动到垃圾箱
工作流另存为应用程序,例如:清理下载。应用程序

这应该比我在测试中使用的AppleScript版本快得多


苹果公司的首选方法是使用
launchd
launchctl
来安排这样的事情

要每天运行清理下载,我将执行以下操作:

  • 将清理下载添加到:系统首选项安全和隐私隐私可访问性
  • 在以下位置创建用户启动代理:
    ~/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>
      
    • 注:参见终端中的
      launchd
      launchctl
      手册页,例如
      man launchctl

      或者使用具有GUI的第三方实用程序,例如:

      注意:我与Lingon X的开发人员无关,但我是一位满意的客户


      对您的AppleScript代码的一些评论:

      无需使用
      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,我只是指出代码中的一些问题。

      @theonlygusti,我已经更新了我的答案,以包括计划使用工作流应用程序的信息。我假设“[]重复每个…”意味着不重复找到的每个子文件夹?因此,@theonlygusti在Automator中创建一个新的应用程序工作流,添加以下操作:…:)是的,将其保存为应用程序。@Jere,是的,这当然是可能的,但是,我相信OP知道这一点,即使没有。。。在实施(可能)具有破坏性组件的任何解决方案之前,用户始终有责任确保适当的备份到位!例如,我有一台时间机器,每15分钟运行一次,我总是确保在测试可能执行预期/想要的操作之前,我当前已备份。就我个人而言,我通常不会实施任何批发删除我的主文件夹中的文件的自动解决方案,我通常手动管理@quiram,要解决您提到的问题,请在工作流的开头添加一个Run Shell脚本操作,并使用以下代码行:
      touch-t$(日期-v-31d+%Y%m%d%H%m.00)~/Downloads/Foobar\u$(日期+%s000);sleep 3
      然后在“获取指定查找项”操作的选项中,检查[√] 忽略此操作的输入复选框。这将创建一个虚拟文件,其修改日期为运行时的-31天,因此至少有一个文件的修改日期为运行时的30天以上。
      文件夹别名可以工作,但语法不好。
      文件夹
      或(一个)
      alias
      。还有一个快捷方式
      …的每个项目(下载文件夹的路径)
      谢谢Vadian。“alias alias”是我的错误。我只是删除了它。
      set thisDate to get (current date) - 30 * days
      
      ... whose modification date is less than thisDate