改进ruby中的递归rmdir

改进ruby中的递归rmdir,ruby,recursion,directory,rmdir,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? 这

我有很多空目录,除了里面的其他空目录。它们还与其他目录混合,这些目录中确实有文件,因此我只想删除空目录及其(现在为空)父目录

我想到了这个:

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\u r(dir)
,而不必编写循环。

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

Errno::enotenty:目录不为空@dir\u s\u 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

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

Errno::enotenty:目录不为空@dir\u s\u 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

这是一个较长的版本。并不比我目前的解决方案更好。注意,我已经发布了工作代码;我正在寻找一些我可能不知道的东西(比如
FileUtils.rmdir\u r(dir)
,或者别的什么)。不,你的代码不起作用。它在深度嵌套的空dir上失败。非常确定我的代码正在工作。我刚刚尝试了14层和22层的目录嵌套。然后,为了好玩,我尝试了60层以上的目录。他们工作都很顺利。另一方面,您的代码在
排序(&:length)
@user137369周围给了我一个
ArgumentError
。这个答案似乎效率更高,因为您会定期检查
空目录中是否有更多目录。例如,在
empty_dirs
lambda中添加一个puts语句,看看调用了多少次。@mudasobwa重要性是一个视角问题,我在阅读“我有很多”时的视角应该是性能。这是一个较长的版本。并不比我目前的解决方案更好。注意,我已经发布了工作代码;我正在寻找一些我可能不知道的东西(比如
FileUtils.rmdir\u r(dir)
,或者别的什么)。不,你的代码不起作用。它在深度嵌套的空dir上失败。非常确定我的代码正在工作。我刚刚尝试了14层和22层的目录嵌套。然后,为了好玩,我尝试了60层以上的目录。他们工作都很顺利。另一方面,您的代码在
排序(&:length)
@user137369周围给了我一个
ArgumentError
。这个答案似乎效率更高,因为您会定期检查
空目录中是否有更多目录。例如,在
empty_dirs
lambda中添加一个puts语句,看看调用了多少次。@mudasobwa重要性是一个视角问题,而我在阅读“我有很多”时的视角是性能应该是重要的。