【问题标题】:What's the Ruby equivalent of Python's os.walk(path, topdown=false)?Python 的 os.walk(path, topdown=false) 的 Ruby 等价物是什么?
【发布时间】:2016-05-06 21:05:02
【问题描述】:

这类似于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. /root/A
  3. /root/B/C/c.txt
  4. /root/B/C
  5. /root/B/b.txt
  6. /root/B

我需要在遍历过程中替换文件内容并重命名文件和目录,因此该顺序的变化是可以的。由于目录重命名,从根目录开始并不是一个有吸引力的选择。

【问题讨论】:

  • 你的意思是like this
  • @tadman 该问题的公认答案指向 Find 模块,其文档称它“支持一组文件路径的自上而下遍历”。 OP 要求相反:自下而上的遍历。
  • 如果您只是颠倒您找到的列表,它可能会起作用。要看!那里探索了几个选项。
  • 出于兴趣,如果还有一个文件夹 /root/B/D 包含文本文件,你期望/希望发生什么 - 你希望从 C 开始,然后找到兄弟目录?

标签: python ruby


【解决方案1】:

虽然我最初为此编写了自己的解决方案(包括在下面),但我更喜欢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. /root/B/C
  4. /root/B/b.txt
  5. /root/A/a.txt
  6. /root/A
  7. /root/B

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-14
    • 2013-06-13
    • 2011-04-12
    • 1970-01-01
    • 1970-01-01
    • 2014-12-29
    • 2011-05-05
    • 1970-01-01
    相关资源
    最近更新 更多