如果我有文件名,如何在文件夹中搜索包含该文件名的文件?

时间:2013-04-30 16:01:29

标签: ruby ruby-2.0

我的图片文件名为media_httpfarm3static_mAyIi.jpg

我想在父文件夹和该父文件夹的所有子文件夹中搜索包含该名称的文件 - 它不必是EXACT名称,但必须包含该字符串。

E.g。应返回此文件:11605730-media_httpfarm3static_mAyIi.jpg

所以这是一个由两部分组成的问题:

  1. 我如何实现上述目标?
  2. 获得该文件后,如何返回该文件的路径?

1 个答案:

答案 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}}

您可以使用ArrayArray#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”扩展到指定用户的主目录。