这类似于What's the Ruby equivalent of Python's os.walk?,但我有兴趣从树叶中走回目录树,而不是根目录。
即,对于像
这样的目录结构/root/
|- A/
|- a.txt
|- B/
|- b.txt
|- C/
|- c.txt
鉴于root
,我想按以下顺序遍历它。
我需要替换文件内容并在遍历期间重命名文件和目录,因此该顺序的变化就可以了。由于目录重命名,从根目录开始并不是一个有吸引力的选择。
答案 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
鉴于问题中的目录树,前面的代码按此顺序遍历(可以安全地重命名文件和目录)。