改进ruby中的递归`rmdir`

问题描述 投票:0回答:1

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

我想出来了:

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) - 而不是必须编写一个循环。

ruby recursion directory rmdir
1个回答
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
© www.soinside.com 2019 - 2024. All rights reserved.