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.jpg
和 sample_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}"
}
}
我希望递归处理所有 .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
的输出,但没有得到其他任何输出。
据我了解应该这样做:
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}"
}
}