这类似于What's the Ruby equivalent of Python's os.walk?,但我感兴趣的是从叶子中遍历目录树,而不是从根目录中走出来。
的目录结构,如
/root/
|- A/
|- a.txt
|- B/
|- b.txt
|- C/
|- c.txt考虑到root,我想按以下顺序遍历它。
在遍历过程中,我需要替换文件内容并重命名文件和目录,所以这个顺序的变化是可以的。由于目录重命名,从根目录开始并不是一个吸引人的选项。
发布于 2016-05-10 16:48:17
虽然我最初编写了自己的解决方案(包括在下面),但我喜欢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给定问题中的目录树,前面的代码按照这个顺序遍历(这对于重命名文件和目录是安全的)。
https://stackoverflow.com/questions/37081413
复制相似问题