我需要删除一堆只包含其他目录的子目录和“.svn”目录。
如果你把它看成一棵树,“叶子”只包含“.svn”目录,所以应该可以删除叶子,然后退回一个级别,删除新叶子等。
我认为这段代码应该这样做,但我仍然坚持要放什么东西。
Find.find('./com/') do |path|
if File.basename(path) == 'something'
FileUtils.remove_dir(path, true)
Find.prune
end
end
有什么建议吗?
答案 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