我的电脑上有一个文件夹,里面保存着临时文件,过一段时间就不需要了。我时不时会手动删除它们。有什么方法可以自动执行此操作?我可以考虑使用 Java 删除上次访问时间超过 20 分钟的文件,但话又说回来,我必须自己运行它,这仍然不是自动化。我使用的是 Windows,文件系统是 NTFS。
答案1
如果你只是想在给定的分钟数后删除文件,而不需要高级逻辑,GNUWin32 构建的 Linux“find”命令是一个简单的选择。
设置
- 下载当前二进制(findutils-4.2.20-2-bin)和依赖性(findutils-4.2.20-2-dep) .zip 文件复制到您的电脑并正常提取它们。
- 将 Dependencies 中的“bin”文件夹的项目复制到 Binaries 中的“bin”文件夹。您也可以复制“manifest”文件夹的项目,但这并不是严格要求的。
- 在二进制文件“bin”文件夹中,将 find.exe 重命名为其他名称(例如 gnu_find.exe)。这可避免与内置 Windows“find”命令混淆。
- 您可以随意重命名/放置二进制文件夹。
使用
删除给定目录中所有超过 X 分钟(例如 5 分钟)的文件(例如 TempFiles)
gnu_find.exe "C:\Path\To\TempFiles" ! -mmin -5 -type f -delete
请注意 !(否定)运算符很重要。如果不使用这个运算符,则会删除 X 分钟内的文件。
要将项目移动到 Windows 回收站(而不是使用-删除直接删除它们),请参阅本答案末尾的“回收站”部分。
选项
-姓名可用于过滤项目。-姓名应该总是出现在-删除否则不会产生任何效果
gnu_find.exe "C:\Path\To\TempFiles" ! -mmin -5 -type f -name "*text*" -delete
在上面的例子中,-姓名匹配文件名中任意位置包含序列“text”的任何文件(包括扩展名)。在需要通配符匹配的任何部分使用星号 (*)。星号可以出现多次。如果匹配精确名称,则必须在 Windows 上包含扩展名。
-exec ex_命令 {} +允许在找到符合条件的项目时使用外部命令,例如“ex_command”。当“find”成功匹配项目时,这对于运行单独的进程(例如批处理文件或类似文件)很有用。此选项应放在“find”选项的末尾,即
gnu_find.exe "C:\Path\To\TempFiles" ! -mmin -5 -type f -delete -exec ex_command {} +
-删除是可选的(所有选项都是可选的)。如果您想预览“find”将要处理的内容(例如,用于测试或故障排除)或只是想要文件列表,则可以将其关闭。
请注意,如果您要列出要输出的文件,则目录名和文件名之间将放置一个 UNIX 正斜杠,例如
C:\Path\To\TempFiles/filename.txt
因此,您可能需要稍后采取适当的步骤来纠正此问题。
其他选项
如果您需要比上面列出的更高级的选项,您可能必须编写自己的脚本。
不同语言的特点各有不同,例如,Python有时间.时间()(当前时间通过时间模块) 也os.path.getctime()和os.path.getmtime()(Windows 创建时间和文件修改时间分别通过操作系统模块)。这些都返回某个纪元时间的秒数浮点数,使得时间比较变得非常容易。
既然你提到了 Java,你可能想看看这个关于 Java NIO 的 StackOverflow 问题具有类似特征。
自动化
正如评论中提到的,Windows 任务计划程序可用于定期运行项目,包括每 X 分钟一次。您可以使用它来运行上面的 GNUWin32“find”命令的单行批处理文件。
您可以在 Windows 7 任务计划程序的触发器设置中将增量设置为最小 1 分钟。您必须在“重复任务间隔:”下拉字段中手动输入自定义增量,例如 1 分钟,否则将使用默认增量列表中的项目。
请注意,虽然任务计划程序可能可以接受,但有一个缺点是它在技术上会在给定时间启动任务,然后重复执行 24 小时。如果在设置任务运行时计算机未打开,这可能会导致问题。
为了解决这个问题,您必须启用“设置→在错过预定的启动后尽快运行任务”。
其他自动化选项
建议使用类似于 UNIX “cron” 实用程序的工具。有许多更好和更差的模拟,但我个人更喜欢IntelliAdmin Cron 服务 v2.0。
IntelliAdmin Cron 安装一个简单的服务,只要服务正在运行,它就会以特定的时间间隔运行列出的任务。它将接受 crontab 文件进行调度,但也有一个 GUI 界面。
需要注意的一点是,GUI 界面中的字段仍然需要 crontab 样式的条目来指定运行时间。您可能需要进一步研究这一点,但每 X 分钟运行一次的格式是
*/X
所有其他值均设置为“*”。因此,如果我们想每分钟运行一个命令,它在界面上看起来会像这样:
分钟以外的时间范围
当然也支持除分钟之外的时间范围,例如
gnu_find.exe "C:\Path\To\TempFiles" -mtime +30 -type f -delete
可用于-删除修改时间超过 30 天的文件。
回收站
很遗憾,-删除直接永久删除项目。但是,您可以使用脚本或第三方可执行文件将项目发送到回收站。
一个答案上面链接的超级用户问题包含一个名为比尼特。您可以结合使用 GNUWin32 版本的“查找”来将项目移动到回收站,-exec ex_命令 {} +前面提到的选项例如
gnu_find.exe "C:\Path\To\TempFiles" ! -mmin -5 -type f -exec "C:\Path\To\binit.exe" {} +
答案2
使用 Powershell 脚本 + 任务管理器:
您可以在 powershell 中使用以下命令来创建脚本(将 30 更改为您想要的分钟数,或将分钟更改为小时或天)
Get-ChildItem -Path "C:\path\to\folder" -Recurse | Where-Object {($_.LastWriteTime -lt (Get-Date).AddMinutes(-30))} | Remove-Item
创建脚本后,将其应用于任务计划程序。