2009-04-14 3 views
1

Ich muss eine Reihe von Unterverzeichnissen löschen, die nur andere Verzeichnisse und ".svn" Verzeichnisse enthalten.Ruby Löschen von Unterverzeichnissen, die nur ein bestimmtes Verzeichnis enthalten

Wenn man es wie ein Baum aussehen, enthalten die „Blätter“ nur „.svn“ Verzeichnisse, so dass es möglich sein sollte, um die Blätter zu löschen, dann auf einer Ebene einen Schritt zurück, löschen Sie die neuen Blätter usw.

Ich denke, dieser Code sollte es tun, aber ich bin auf was stecken in "etwas" stecken.

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

Irgendwelche Vorschläge?

Antwort

2

Dieser neue Blätter berücksichtigt für Einträge (sort.reverse schaffen könnte bedeutet, dass /a/b/.svn vor/a/b verarbeitet wird, also wenn/a/b sonst leer ist, wird es entfernt und die Größe < = 2 ist, weil mit fNM_DOTMATCH glob immer mindestens 2 Einträge zurückgibt ('.' und '..'))

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

Das hat ganz gut funktioniert, danke! – kraryal

0

Dies würde die Arbeit tun ... nehmen Sie es sich jedoch nicht in Betracht zieht, dass die eigene Sicht der sie neue Blätter

#!/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