Улучшение рекурсивного `rmdir` в ruby - PullRequest
0 голосов
/ 03 июня 2018

У меня есть много пустых каталогов, за исключением других пустых каталогов внутри них.Они также смешаны с другими каталогами, в которых есть файлы, поэтому я хочу удалить только пустые каталоги и их (теперь пустых) родителей.

Я придумал это:

empty_dirs = -> { Dir.glob("#{dir}/**/*").select { |d| File.directory?(d) && Dir.empty?(d) } }
empty_dirs.call.each { |d| Dir.rmdir(d) } until empty_dirs.call.empty?

Это прекрасно работает, но мне было интересно, есть ли стандартный способ - например, FileUtils.rmdir_r(dir) - вместо того, чтобы писать цикл.

1 Ответ

0 голосов
/ 03 июня 2018

Dir.rmdir - это оболочка для rmdir оболочки, которая завершается ошибкой, когда каталог не пуст (версия ruby ​​вызывает исключение)

Errno :: ENOTEMPTY: каталог не пуст @ dir_s_rmdir

Можно воспользоваться этим

Dir.glob("#{dir}/**/*").
  select(&File.method(:directory?)).
  sort_by(&:length).  # to start as deep as possible
  reverse.         # longest first 
  each do |directory|
    Dir.rmdir(directory) rescue :skipped 
  end
...