【问题标题】:Mac shell script to delete filesMac shell脚本删除文件
【发布时间】:2018-08-07 04:14:17
【问题描述】:

我有一个用于删除 .rtf 文件的 Mac shell 脚本。现在我想删除只有数字的文件夹名称(例如 1、2、3、10),它应该早于 5 天。怎么写?

我当前的脚本:

find "/Library/Agents/_wrk" -type f -name "*.rtf" -delete

【问题讨论】:

    标签: macos shell


    【解决方案1】:

    试试这个:

    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
    

    如果你想删除digit1digit4,你应该使用上面的命令。 find 会将digit1 传递给rm 并且目录将被删除,但find 无论如何都会尝试遍历它(生成错误)。但多亏了它,它也会遍历不匹配的nodigit(和remoe digit4)。

    如果您只想删除digit1 目录而不是遍历nodigit,您可以使用这个:

    find . -maxdepth 1 -type d -name '*[0-9]*' -execdir rm -rf  -- '{}' \;
    

    使用-maxdepth 告诉find 它是否应该进入目录(以及多深)。它还会阻止错误的产生(因为它不会尝试访问它们)。

    我只提另一个解决方案:从控制台转发stderr,这样就不会打印错误。

    【讨论】:

    • 我们不能为那个添加路径
    • @AMNKumari 我编辑了我的答案以显示路径。但我的警告是有效的 - rm -rf 很危险,你应该小心。
    • 非常感谢它的工作。如果您知道,请解释如何将其设置为计划而不手动运行。
    • 这是另一个问题,但您可以谷歌 cron(或查看 Stack Overflow)。它将允许您按计划运行命令或脚本。
    • 添加此内容后,我收到此错误 find "/Library/Agents/_wrk/" -type d -mtime +5find 。 -type d -mtime +5 -name '[0-9]'