【问题标题】:Bash Script OSX not deleting files it findsBash Script OSX 不删除它找到的文件
【发布时间】:2012-03-30 03:42:20
【问题描述】:

我这里有这个 bash 脚本

#!/bin/bash
find /Users/ -name "*.mov" -o -name "*.flv" -o -name "*.mp4" -o -name "*.avi" -o -name "*.wmv" -o -name "*.mpeg" -o -name "*.avi" -o -name "*.wmv" -o -name "*.f4v" -o -name "*.m4v" -o -name "*.mxf" -o -name "*.ts" -type f -mtime +7 -exec rm -rf {} \;

它会找到所有超过 7 天的文件,并且工作正常,但是当我希望它删除我发现的结果集时,它不会删除任何文件。有什么我做错了吗?这是在 Mac OSX 10.6 上

任何帮助都会很棒。谢谢!

【问题讨论】:

  • 如果您在-execrm 之间插入echo,它会列出您期望的命令吗?如果是这样 - 如果您尝试自己直接运行这些命令之一,而不使用 find,会发生什么?
  • 我运行 find 命令,它列出了我希望找到的所有文件。

标签: macos bash cron find


【解决方案1】:

find 命令位于 /usr/bin 中,它不在 cron 作业的默认 PATH 中。以/usr/bin/find 运行它,或者在脚本的开头设置 PATH。

【讨论】:

    【解决方案2】:

    如果-delete 选项在您的find 命令版本上可用,请尝试使用-exec rm -rf {}\; 选项。这将在每次尝试删除失败后显示一条错误消息。这可能会为您提供更多信息。

    $ find . -name "*.foo" -type f -mtime +7 -delete
    find: -delete: unlink(./four.foo): Permission denied
    find: -delete: unlink(./one.foo): Permission denied
    find: -delete: unlink(./three.foo): Permission denied
    find: -delete: unlink(./two.foo): Permission denied
    

    find 都没有从 delete/rm 命令返回实际的退出代码。你可能想做这样的事情:

    find . -name ... -type f -mtime +7 | while read file
    do
       if rm -fr $file
       then
          echo "Successfully deleted $file"
       else
          echo "Error deleting file: Exit code $?"
       fi
    done
    

    这可能会让您更好地了解正在发生的事情。

    【讨论】:

    • 成功了,谢谢!! #!/bin/bashfind /Users/ -name "*.mov" -o -name "*.mpg" -o -name "*.flv" -o -name "*.mp4" -o -name "*.avi" -o -name "*.wmv" -o -name "*.mpeg" -o -name "*.avi" -o -name "*.wmv" -o -name "*.f4v" -o -name "*.m4v" -o -name "*.mxf" -o -name "*.ts" -type f -mtime +7 | while read filedo if rm -fr $file then echo "Successfully deleted $file" else echo "Error deleting file: Exit code $?" fi done
    • 为了在 OSX 上按计划运行,我不能使用 crontab 我不得不使用这个名为 Lingon 的调度程序
    【解决方案3】:

    也许您应该使用 sudo 运行命令?作为普通用户,您可能没有对所有目录的完全访问权限。

    【讨论】:

    • 如何在不输入密码的情况下运行sudo?
    • 哦,我是在 cron 工作中测试的,我做了 sudo crontab -e -u root
    • @cohortq:从 cron-jobs 运行的命令的行为通常与在命令行运行的命令不同,因为 cron 不运行您的配置文件设置脚本(设置 $PATH等等)。要查看发生了什么,您可以在 find 命令之前添加命令 exec >>/home/cohortq/whats-going-on.txt 2>&1。然后它将任何错误信息附加到/home/cohortq/whats-going-on.txt
    • 你的shell脚本可执行吗?也许它根本没有被调用?可能您必须在 cron 调用的脚本中使用绝对路径 /usr/bin/find。我不确定 /usr/bin 是否在 crons 搜索路径中。
    • 我对进入 cron 的文件做了 chmod u+x
    猜你喜欢
    • 2014-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-14
    • 1970-01-01
    • 1970-01-01
    • 2015-09-29
    • 2014-08-27
    相关资源
    最近更新 更多