我的图片文件名为media_httpfarm3static_mAyIi.jpg
。
我想在父文件夹和该父文件夹的所有子文件夹中搜索包含该名称的文件 - 它不必是EXACT名称,但必须包含该字符串。
E.g。应返回此文件:11605730-media_httpfarm3static_mAyIi.jpg
所以这是一个由两部分组成的问题:
答案 0 :(得分:4)
使用Dir::[]
和File::absolute_path
:
partial_name = "media_httpfarm3static_mAyIi.jpg"
Dir["../**/*#{partial_name}"].each do |filename|
puts File.absolute_path(filename)
end
这使用glob "../**/*media_httpfarm3static_mAyIi.jpg"
(上一个目录,然后搜索所有子目录(递归),对于以部分字符串"media_httpfarm3static_mAyIi.jpg"
结尾的任何文件。然后在{{}}中返回相对路径。 {3}}
您可以使用Array
,Array#each
等将其转换为您需要的内容。要将相对路径转换为绝对路径,只需将其传递给Array#map
。
获得绝对路径后,可以使用它来打开文件,读取文件等等。
glob "../**/*media_httpfarm3static_mAyIi.jpg"
是相对于当前工作目录的。通常,这是运行程序的目录。不是源文件的目录。这可以使用各种实用程序进行更改以进行更改。
要始终使用相对于源代码文件的glob,请尝试:
Dir[File.expand_path('../**/*#{partial_name}', __FILE__)]
您也可以使用:
Dir[File.join(__dir__, "..", "**", "*#{partial_name}")]
注意: __dir__
已添加到Ruby 2.0中。对于旧版本的ruby,请使用File.dirname(__FILE__)
在第一个代码中使用了样本File::absolute_path
。在最后一个样本中使用了File::absolute_path
。在大多数情况下,这些可以互换使用。根据文件,存在细微差别:
File::expand_path
将路径名转换为绝对路径名。相对路径是 从进程的当前工作目录引用,除非 给出了dir_string,在这种情况下它将用作起始 点。如果给定的路径名以“〜”开头,则不会展开它 被视为普通目录名称。
File::absolute_path
将路径名转换为绝对路径名。相对路径是 从进程的当前工作目录引用,除非 给出了dir_string,在这种情况下它将用作起始 点。给定的路径名可能以“〜”开头,后者扩展为 进程所有者的主目录(环境变量HOME必须是 设置正确)。 “~user”扩展到指定用户的主目录。