macos - Mac shell脚本删除文件
问题描述
我有一个 Mac shell 脚本来删除 .rtf 文件。现在我想删除只有数字的文件夹名称(例如 1、2、3、10),它应该早于 5 天。我该怎么写?
我当前的脚本:
find "/Library/Agents/_wrk" -type f -name "*.rtf" -delete
解决方案
尝试这个:
find /path/to/files/ -type d -mtime +5 -name '*[0-9]*' -execdir rm -rf -- '{}' \;
解释:
-type d
我们想要目录,-mtime +5
超过 5 天-name
名称中包含任何数字-execdir rm -rf
我们想删除它
小心- 如果你在错误的位置运行这条线可能会破坏你的系统。rm -rf
将删除所有匹配的文件而不进行确认。我建议你先运行:
find /path/to/files/ -type d -mtime +5 -name '*[0-9]*'
检查是否选择了正确的文件(它只会打印匹配的文件)。
编辑: 上述解决方案有效,但会产生错误(如评论中所述)。这是因为 find 尝试在刚刚删除的目录中进行搜索。
假设我们有这个文件结构(只有目录):
baseDir
- digit1
- digit2
- nodigit
- digit4
如果你想删除digit1
,digit4
你也应该使用上面的命令。find
将传递digit1
到rm
并且目录将被删除,但find
无论如何都会尝试遍历它(产生错误)。但多亏了它,它也会遍历不匹配的nodigit
(和 remoe digit4
)。
如果您只想删除digit1
目录而不是遍历nodigit
,可以使用:
find . -maxdepth 1 -type d -name '*[0-9]*' -execdir rm -rf -- '{}' \;
使用-maxdepth
告诉find
它是否应该进入目录(以及多深)。它还会阻止错误的产生(因为它不会尝试访问它们)。
我只提另一个解决方案:stderr
从控制台转发,这样就不会打印错误。
推荐阅读
- c# - 使用rest api和c#在tableau server中创建用户
- ruby - 如何检查 ruby-2.6.3 是否使用 jemalloc ?我将 ruby-2.6.3 安装为 $ rvm install 2.6.3 -C --with-jemalloc
- java - 转让税计算器
- c# - c# 从动态对象(已从 JSON 字符串转换)转换回 DataTable
- php - 自动回复不适用于使用 php mail() 的 gmail 帐户
- python - 如何使用 blit 有效地重绘多个 matplotlib 图
- python - 识别特定字符串并将其放在同一索引中
- java - 为什么 hadoop fs 命令不能执行来创建目录?
- azure - Microsoft 通过加载每个模块来学习我收到此错误:“检测到未经授权的沙箱使用。您的沙箱已被终止。”
- java - Android Studio 中的 Listview 与 TableView