Ruby Удаление подкаталогов, которые содержат только определенный каталог - PullRequest
1 голос
/ 14 апреля 2009

Мне нужно удалить несколько подкаталогов, которые содержат только другие каталоги, и каталоги ".svn".

Если вы смотрите на это как на дерево, «листья» содержат только каталоги «.svn», поэтому должна быть возможность удалить листья, затем вернуться на уровень вверх, удалить новые листья и т. Д.

Я думаю, что этот код должен это делать, но я застрял на том, что положить в "что-то".

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

Есть предложения?

Ответы [ 2 ]

2 голосов
/ 14 апреля 2009

Этот учитывает новые листья (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 голосов
/ 14 апреля 2009

Это сделало бы работу ... однако это не учитывает, что ее собственный запуск может создать новые листья

#!/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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...