改进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重要性是一个视角问题,而我在阅读“我有很多”时的视角是性能应该是重要的。