我希望递归处理所有.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.jpg
和sample_S.jpg
的输出,但没有输出任何其他内容。
答案 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}"
}
}