【发布时间】:2018-08-07 04:14:17
【问题描述】:
我有一个用于删除 .rtf 文件的 Mac shell 脚本。现在我想删除只有数字的文件夹名称(例如 1、2、3、10),它应该早于 5 天。怎么写?
我当前的脚本:
find "/Library/Agents/_wrk" -type f -name "*.rtf" -delete
【问题讨论】:
我有一个用于删除 .rtf 文件的 Mac shell 脚本。现在我想删除只有数字的文件夹名称(例如 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,这样就不会打印错误。
【讨论】:
rm -rf 很危险,你应该小心。
cron(或查看 Stack Overflow)。它将允许您按计划运行命令或脚本。