0

ファイル名の画像がありますmedia_httpfarm3static_mAyIi.jpg

親フォルダーとその親フォルダーのすべてのサブフォルダーで、その名前を含むファイルを検索したいと思います。正確な名前である必要はありませんが、その文字列が含まれている必要があります。

たとえば、次のファイルが返されます。11605730-media_httpfarm3static_mAyIi.jpg

したがって、これは 2 部構成の質問です。

  1. 上記を達成するにはどうすればよいですか?
  2. ファイルを取得したら、そのファイルのパスを返すにはどうすればよいですか?
4

1 に答える 1

4

とを使用Dir::[]File::absolute_pathます。

partial_name = "media_httpfarm3static_mAyIi.jpg"
Dir["../**/*#{partial_name}"].each do |filename|
  puts File.absolute_path(filename)
end

これはグロブを使用します"../**/*media_httpfarm3static_mAyIi.jpg"(1 つ上のディレクトリに移動し、すべてのサブディレクトリを (再帰的に) 検索して、部分文字列 で終わるファイルを探します"media_httpfarm3static_mAyIi.jpg"。相対パスはArray.

Array#each、などを使用Array#mapして、これを必要なものに変換できます。相対パスを絶対パスに変換するには、それを に渡すだけFile::absolute_pathです。

絶対パスを取得したら、それを使用してファイルを開いたり、ファイルを読み取ったりできます。

ファイル パス上

グロブ"../**/*media_httpfarm3static_mAyIi.jpg"は、現在の作業ディレクトリに相対的です。通常、これはプログラムが実行されたディレクトリです。ソースファイルのディレクトリではありません。これは、さまざまなユーティリティを使用して変更できます。

ソースコードファイルに相対的なグロブを常に使用するには、次を試してください。

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::expand_pathで使用されます。ほとんどの場合、これらは同じ意味で使用できます。ドキュメントによると、わずかな違いがあります。

File::absolute_path

パス名を絶対パス名に変換します。相対パスは、dir_string が指定されていない限り、プロセスの現在の作業ディレクトリから参照されます。この場合、それが開始点として使用されます。指定されたパス名が「~」で始まる場合、展開されず、通常のディレクトリ名として扱われます。

File::expand_path

パス名を絶対パス名に変換します。相対パスは、dir_string が指定されていない限り、プロセスの現在の作業ディレクトリから参照されます。この場合、それが開始点として使用されます。指定されたパス名は「~」で始まる場合があり、これはプロセス所有者のホーム ディレクトリに展開されます (環境変数 HOME が正しく設定されている必要があります)。「~user」は、指定されたユーザーのホーム ディレクトリに展開されます。

于 2013-04-30T16:04:36.670 に答える