Ruby删除仅包含特定目录的子目录

时间:2009-04-14 05:22:08

标签: ruby file-io directory

我需要删除一堆只包含其他目录的子目录和“.svn”目录。

如果你把它看成一棵树,“叶子”只包含“.svn”目录,所以应该可以删除叶子,然后退回一个级别,删除新叶子等。

我认为这段代码应该这样做,但我仍然坚持要放什么东西。

Find.find('./com/') do |path|
    if File.basename(path) == 'something'
        FileUtils.remove_dir(path, true)
        Find.prune
    end
end

有什么建议吗?

2 个答案:

答案 0 :(得分:2)

这个考虑新的叶子(sort.reverse表示条目意味着/a/b/.svn在/ a / b之前处理;因此如果/ a / b是空的,它将被删除并且大小< = 2是因为使用FNM_DOTMATCH glob将始终返回最少2个条目('。'和'..'))

require 'fileutils'

def delete_leaves(dirname)
    Dir.glob(dirname+"/**/",File::FNM_DOTMATCH).sort.reverse.each do |d|
        FileUtils.rm_rf(d) if d.match(/.svn/) or Dir.glob(d+"/*",File::FNM_DOTMATCH).size<=2  
    end  
end
delete_leaves(ARGV[0])

答案 1 :(得分:0)

这可以胜任......但是没有考虑到它自己的运行可以创造新的叶子

#!/usr/bin/env ruby

require 'fileutils'

def remove_leaves(dir=".")
  Dir.chdir(dir) do 
    entries=Dir.entries(Dir.pwd).reject { |e| e=="." or e==".."}
    if entries.size == 1 and entries.first == ".svn"
      puts "Removing #{Dir.pwd}"
      FileUtils.rm_rf(Dir.pwd)
    else
      entries.each do |e|
        if File.directory? e
          remove_leaves(e)
        end
      end
    end
  end
end

remove_leaves