我有一个工作站,用于临时存储图像,然后将压缩版本上传到服务器进行安全保存。我有兴趣每天凌晨 3 点使用通过 launchd 安排的脚本删除旧文件一次。
#!/bin/bash
find /some/directory/with/pictures/* -exec rm -rf {} \+
我已经验证了它可以在仅具有大约 250 mb 图像(30 张图像)的开发工作站上运行。
由于生产工作站尚未运行此脚本,因此它们很多图像的大小约为几百 GB。这意味着当find
通过 shell 脚本执行时,它会停止并显示“参数太多”。
我花了很多时间试图找出原因(尝试 xargs,看看更改是否+
会;
影响任何东西……等等),我唯一没有尝试的是通过 shell 脚本进入目录以避免完全使用 find。我认为“参数太多”是有道理的 - 听起来参数数量有上限,而我在一台工作站上验证这个概念时有大约 33,000 个文件。
让我更加困惑的是,find ./ -exec rm -rf {} \;
通过终端在目录内执行是可以的(很慢)。
我已经使用终端执行了删除操作,所以我不担心将来的过程(它不会在一天内产生接近 33k 张图片),但我想知道的是为什么 find
可以在终端中使用 33k 个参数,但在 shell 脚本中则不行。
答案1
您遇到了 *nix”打开的文件过多“问题!Macos 对进程和系统一次可以打开的文件数量有限制。这与ulimit
大多数 Linux 系统上与 Init 交互的方式非常相似。
这些限制是针对终端和基于文件系统的应用程序分别设置的。每个进程的默认限制都继承自 mac 上的 launchd(自 Leopard 左右开始),您可以使用以下命令查看编译后的值sudo launchctl limit
有一些方法可以改变这种行为,例如如何持续控制 Mac 上的最大系统资源消耗?, 和哪个命令控制打开文件的限制?