改进ruby中的递归`rmdir`

时间:2018-06-03 10:21:59

标签: ruby recursion directory rmdir

我有很多空目录,除了其中的其他空目录。它们还与其中包含文件的其他目录混合在一起,因此我只想删除空目录及其(现在为空)父目录。

我想出了这个:

empty_dirs = -> { Dir.glob("#{dir}/**/*").select { |d| File.directory?(d) && Dir.empty?(d) } }
empty_dirs.call.each { |d| Dir.rmdir(d) } until empty_dirs.call.empty?

这很好用,但我想知道是否有标准的方法 - 比如FileUtils.rmdir_r(dir) - 而不是必须写一个循环。

1 个答案:

答案 0 :(得分:3)

Dir.rmdir是shell rmdir的包装器,当目录不为空时失败(ruby版本引发异常)

  

Errno :: ENOTEMPTY:目录不为空@dir_s_rmdir

有人可能会利用这个

Dir.glob("#{dir}/**/*").
  select(&File.method(:directory?)).
  sort_by(&:length).  # to start as deep as possible
  reverse.         # longest first 
  each do |directory|
    Dir.rmdir(directory) rescue :skipped 
  end