Linux timeout命令对含*的rm -rf不生效的原因及替代方案咨询
关于
timeout配合rm通配符失效的问题解答 失效原因
shell的通配符展开(比如*)是在执行命令前完成的:当你输入timeout 10 rm -rf /path/test/*时,shell会先把/path/test/*展开成该目录下所有文件和子目录的完整路径列表,之后才会启动timeout进程并让它去监控rm进程。
如果/path/test下的文件数量极多,shell完成通配符展开的时间可能远超10秒,这个阶段timeout还没运行,自然无法限制耗时;就算展开很快,timeout也只能监控后续rm的执行时间,无法覆盖前面的通配符展开阶段,最终导致你觉得timeout没生效。
无需find的替代方案
方案1:用子shell包裹通配符逻辑
把通配符展开放到timeout启动的子shell里,让timeout覆盖从通配符展开到rm执行的全流程:timeout 10 sh -c 'for item in /path/test/*; do rm -rf "$item"; done'方案2:直接删除目录再重建(更高效)
如果目标是清空/path/test目录,没必要用通配符,直接删除整个目录再重新创建:timeout 10 rm -rf /path/test && mkdir -p /path/test这个命令避开了通配符展开的问题,
timeout会直接监控rm的执行过程。方案3:使用globstar递归删除(bash 4+适用)
若需要递归删除目录下所有内容(包括子目录里的文件),可以开启bash的globstar选项,同样用子shell包裹:timeout 10 sh -c 'shopt -s globstar; rm -rf /path/test/**'
内容的提问来源于stack exchange,提问作者Pandit Biradar
相关产品推荐
相关产品推荐

