Dir.glob 递归处理所有文件并跟踪它们的父目录

Dir.glob to process all files recursively and keep track of their parent directory

我希望递归处理所有 .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 的输出,但没有得到其他任何输出。

据我了解应该这样做:

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 中还有其他方法,但我在这里坚持使用基本方法。

我发现了另一种有两个循环的方法,我相信在某些情况下它会更快,因为它不会为每个文件调用 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}"
  }      
}