递归列出文件或目录时,避免“检测到堆栈粉碎”

问题描述

我必须重命名位于远程存储中的大约5000个文件夹。运行Dir['**/*/']返回错误“ *** stack smashing detected ***”,并邀请我报告在解释过程中可能发生的错误(请参见bug report

如果有帮助的话,这是我计划运行的脚本(尽管它非常适合我的需求,但可以在测试环境中正常运行)

#!/usr/bin/env ruby

# Fetch root directories 
dirs = Dir['**/*/'].select { |d| d =~ /\d([\.-]{1}\d{2,})?/ }

# Order subdirectories first
dirs = dirs.sort_by { |d| d.count('/') }.reverse

# Substitute "." and "-" placed after the last "/" with "_"
dirs.each do |dir|
  File.rename(dir,dir.gsub(/[\.-](?!.*\/.*)/,'_'))
end

是否有缓解此问题的建议?

解决方法

这既不是形式合理的问题,也不是通用的答案,但我设法通过指定要研究的深度来解决该问题。具体来说,我将Dir['**/*/']替换为Dir['*/*/*/*/']

但是,我愿意接受其他建议,因为其他人可能会遇到类似的问题,而无法对要深入研究的问题进行硬编码。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...