我正在使用 macOS 和rm
GNU coreutils 的工具(不是 macOS 自己的rm
)。
所以我有一个脚本,我可以在其中清理一些这样的目录:
if [ -d "${cleanup_repo_clone_root}" ]; then
echo "Cleaning up tmp directory: ${cleanup_repo_clone_root}"
set -x; rm -rf -- "${cleanup_repo_clone_root}"
fi
我扔set -x
在那里看看发生了什么。
它向我显示输出:
+ set -x
+ rm -rf -- /var/folders/h7/n46zg3md4l57vzsgxcs355/T/tmp.eizQw1iNBQ
rm: cannot remove '/var/folders/h7/n46zg3md4l57vzsgxcs355/T/tmp.eizQw1iNBQ': Directory not empty
但如果我复制粘贴该 rm 命令并执行它,它工作正常!
$ rm -rf -- /var/folders/h7/n46zg3md4l57vzsgxcs355/T/tmp.eizQw1iNBQ
这里发生了什么?
rm
对多个文件或目录进行操作时的操作不是原子的。这在这种情况下rm -r
很重要,因为自下而上搜索文件和目录,将它们从叶子中删除到请求路径的根目录。它通过unlink
ing 和rmdir
ing 来完成此操作,直到什么都没有,然后rmdir
是最终目录。这些事情是按顺序发生的,所以如果在
rmdir
发布之前创建了更多文件,你就会回来ENOTEMPTY
(“目录不为空”)。您的脚本或系统上运行的其他进程很可能正在与
rm -rf
. 您可能需要考虑:rm -rf
(尽管其他应用程序可能会失败,因为该目录已从其下方删除)您可以找到使用类似
fanotify
或 eBPF 脚本(例如opensnoop
来自BCC )创建文件的其他应用程序。inotify
也可能有帮助,但遗憾的是它的输出中不包括创建文件的过程。另一种可能性是删除文件失败,但这可能会被
-f
. 尝试在没有的情况下运行-f
以查看在这种情况下可能出现的错误。事实证明,
open $dir
我之前的一个调用是在 macOS Finder(文件浏览器桌面应用程序)上启动我要删除的目录的子目录之一。如果有一个进程锁定了您要删除的目录中的一个文件/目录,则macOS 似乎给出了这个神秘
Directory not empty
的 (ENOEMPTY) 错误。