什么是Ruby等价的Python的os.walk(路径,topdown = false)?

时间:2016-05-06 21:05:03

标签: python ruby

这类似于What's the Ruby equivalent of Python's os.walk?,但我有兴趣从树叶中走回目录树,而不是根目录。

即,对于像

这样的目录结构
/root/
|- A/
   |- a.txt
|- B/
   |- b.txt
   |- C/
      |- c.txt

鉴于root,我想按以下顺序遍历它。

  1. /root/A/a.txt
  2. /根/ A
  3. /root/B/C/c.txt
  4. /根/ B / C
  5. /root/B/b.txt
  6. /根/ B
  7. 我需要替换文件内容并在遍历期间重命名文件和目录,因此该顺序的变化就可以了。由于目录重命名,从根目录开始并不是一个有吸引力的选择。

1 个答案:

答案 0 :(得分:0)

虽然我最初为此编写了自己的解决方案(包含在下面),但我更喜欢Casper的建议,http://github.com/samonzeweb/walk,因为它的行为完全 os.walk(x, topdown=false)在Python中完成。

我的原始解决方案如下。它的用法与os.walk()不同,因为它会生成单个文件和目录路径,而不是(path, subdirs, files)的元组。

def bottomup_path_walk(dir, &block)
  files = []
  subdirs = []
  Dir.glob(File.join(dir, "*")).each do |path_str|
    path = Pathname.new(path_str)
    if path.directory?
      bottomup_path_walk(path, &block)
      subdirs << path
    elsif path.file?
      files << path
    end
  end

  files.each   { |f| yield f }
  subdirs.each { |d| yield d }
end

鉴于问题中的目录树,前面的代码按此顺序遍历(可以安全地重命名文件和目录)。

  1. /root/B/C/c.txt
  2. /root/B/b.txt
  3. /根/ B / C
  4. /root/B/b.txt
  5. /root/A/a.txt
  6. /根/ A
  7. /根/ B