Ruby中如何复制仅以字母而非数字开头的文件夹
原代码问题分析
原代码存在4个明显问题,无法实现需求:
- 匹配规则错误:
[a-z]仅能匹配名称长度为1的小写字母开头的路径,名称长度大于1的文件夹(比如docs、project1)完全无法匹配 - 大小写限制:默认glob区分大小写,大写字母开头的文件夹(比如
Assets、User)会被直接过滤 - 未筛选路径类型:没有判断匹配到的路径是不是文件夹,符合命名规则的普通文件也会被误复制
- 缺少目标路径校验:如果目标路径
dest不存在,cp_r会直接抛出异常
正确实现方式
首先需要修正glob匹配规则,增加文件夹过滤逻辑,提前做好目标路径的兼容处理,完整实现代码如下:
require 'fileutils' # 按需替换源路径前缀、目标路径 source_root = "folderpath" target_root = "dest" # 提前创建目标路径,避免不存在时复制报错 FileUtils.mkdir_p(target_root) unless File.exist?(target_root) # glob匹配首字符为字母、后续任意字符的路径,不区分大小写 Dir.glob("#{source_root}/[a-zA-Z]*", File::FNM_CASEFOLD) do |entry| # 跳过非文件夹的条目 next unless File.directory?(entry) # 递归复制文件夹到目标路径 FileUtils.cp_r(entry, target_root) end
如果不需要匹配大写字母开头的文件夹,删除File::FNM_CASEFOLD参数即可。如果需要避免覆盖目标路径下的同名文件夹,可以给cp_r增加:noop => true先预览复制行为,确认后再执行,或者增加:update => true参数仅复制更新的内容。
内容的提问来源于stack exchange,提问作者Sofia Shaikh
相关产品推荐
相关产品推荐

