Ruby: как я рекурсивно нахожу и удаляю пустые каталоги?

Попробуйте что-то вроде этого...

<bean
    id="mySessionFactory"
    class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">

    <property name="configLocation">    
        <value>
            classpath:location_of_config_file/hibernate.cfg.xml
        </value>
    </property>

    <property name="hibernateProperties">
        <props>

            ...    


        </props>    
    </property>

</bean>
8
задан Dane O'Connor 17 August 2009 в 22:00
поделиться

5 ответов

Рубиновый:

Dir['**/*']                                            \
  .select { |d| File.directory? d }                    \
  .select { |d| (Dir.entries(d) - %w[ . .. ]).empty? } \
  .each   { |d| Dir.rmdir d }
17
ответ дан 5 December 2019 в 05:08
поделиться

Почему бы просто не использовать оболочку?

find. -type d -empty -exec rmdir '{}' \;

Делает именно то, что вы хотите.

2
ответ дан 5 December 2019 в 05:08
поделиться

Я тестировал этот сценарий на OS X, но если вы работаете в Windows, вам необходимо внести изменения.

Вы можете найти файлы в каталоге, включая скрытые файлы , с записями Dir #.

Этот код удалит каталоги, которые станут пустыми после удаления любых подкаталогов.

def entries(dir)
  Dir.entries(dir) - [".", ".."]
end

def recursively_delete_empty(dir)
  subdirs = entries(dir).map { |f| File.join(dir, f) }.select { |f| File.directory? f }
  subdirs.each do |subdir|
    recursively_delete_empty subdir
  end

  if entries(dir).empty?
    puts "deleting #{dir}"
    Dir.rmdir dir
  end
end
0
ответ дан 5 December 2019 в 05:08
поделиться
Dir.glob('**/*').each do |dir|
  begin
    Dir.rmdir dir if File.directory?(dir)
  # rescue # this can be dangereous unless used cautiously
  rescue Errno::ENOTEMPTY
  end
end
0
ответ дан 5 December 2019 в 05:08
поделиться
module MyExtensions
  module FileUtils
    # Gracefully delete dirs that are empty (or contain empty children).
    def rmdir_empty(*dirs)
      dirs.each do |dir|
        begin
          ndel = Dir.glob("#{dir}/**/", File::FNM_DOTMATCH).count do |d|
            begin; Dir.rmdir d; rescue SystemCallError; end
          end
        end while ndel > 0
      end
    end
  end

  module ::FileUtils
    extend FileUtils
  end
end
1
ответ дан 5 December 2019 в 05:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: