2009-04-14 128 views
1

我需要刪除一堆僅包含其他目錄和「.svn」目錄的子目錄。Ruby刪除僅包含特定目錄的子目錄

如果你看起來像一棵樹,「葉子」只包含「.svn」目錄,所以應該可以刪除樹葉,然後再升級一級,刪除新樹葉等。

我認爲這段代碼應該這樣做,但我堅持要在「什麼」放什麼。

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

有什麼建議嗎?

回答

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]) 
+0

這很好用,謝謝! – kraryal 2009-04-25 21:55:16

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