Dir.glob以递归方式处理所有文件并跟踪其父目录

时间:2015-01-26 16:11:40

标签: ruby recursion

我希望递归处理所有.jpg文件。我还需要在某些变量中使用其父目录。所以我离开了:

Dir.cwd("/some/path")

Dir.glob("**/*.jpg") { |the_file| }

为:

Dir.cwd("/some/path")

Dir.glob("**/") { |the_dir|
  Dir.glob("#{the_dir}*.jpg") { |the_file|
    puts "file: #{the_file} is at #{the_dir}"
  }      
}

不幸的是,它忽略了Dir.cwd本身的* .jpg文件。对于我的测试目录:

$ find  
.
./some_dir
./some_dir/another_one
./some_dir/another_one/sample_A.jpg
./some_dir/sample_S.jpg
./sample_4.jpg
./sample_1.jpg
./sample_3.jpg
./sample_2.jpg

我获得了sample_A.jpgsample_S.jpg的输出,但没有输出任何其他内容。

2 个答案:

答案 0 :(得分:1)

根据我的理解,这应该做:

Dir.glob("**/*.jpg") do |thefile| 
  puts "#{File.basename(thefile)} is at #{File.dirname(thefile)}"  
end

dirname仅为您提供父目录。

如果您想要完整路径名,可以dirname延长expand_path。 即:File.dirname(File.expand_path(thefile)),它应该为您提供文件的完整路径。

旁注,ruby中还有其他方法>来自File class的2.0,但我确实坚持使用基本的。

答案 1 :(得分:0)

我发现另外一种方法有两个循环,我相信在某些情况下会更快,因为它不会为每个文件调用File.dirname

Dir.glob("{./,**/}") { |the_dir|
  # puts "dir: #{the_dir}"

  Dir.glob("#{the_dir}*.jpg") { |the_file|
    puts "file: #{the_file} is at #{the_dir}"
  }      
}