在 Shell 脚本中,查找会因“参数过多”而失败,但如果直接在终端中运行则不会失败

在 Shell 脚本中,查找会因“参数过多”而失败,但如果直接在终端中运行则不会失败

我有一个工作站,用于临时存储图像,然后将压缩版本上传到服务器进行安全保存。我有兴趣每天凌晨 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 上的最大系统资源消耗?, 和哪个命令控制打开文件的限制?

相关内容