2009-04-14 2 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 записи ('.' and '..'))

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

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 
Смежные вопросы