如何使用Ruby获取一个文件夹中的所有文件名?

时间:2011-06-11 16:43:12

标签: ruby regex

这些位于文件夹中:

This_is_a_very_good_movie-y08iPnx_ktA.mp4
myMovie2-lKESbDzUwUg.mp4
his_is_another_movie-lKESbDzUwUg.mp4

如何通过提供最后一部分mymovie1从文件中获取字符串y08iPnx_ktA的第一部分?类似的东西:

get_first_part("y08iPnx_kTA") #=> "This_is_a_very_good_movie"

4 个答案:

答案 0 :(得分:3)

将问题分解成部分。方法get_first_part应该类似于:

  1. 使用Dir获取文件列表。

  2. 迭代每个文件;

    1. 提取“name”('This_is_a_very_good_movie')和“tag”('y08iPnx_ktA')。每个文件都应该使用相同的正则表达式。

    2. 如果“标记”与要查找的内容匹配,请返回“名称”。

  3. 快乐的编码。


    在REPL中玩耍并玩得开心: - )

答案 1 :(得分:1)

它可以比这更干净吗?根据@Tin Man的建议修改

def get_first_part(path, suffix)
  Dir.glob(path + "*" + suffix + "*").map { |x| File.basename(x).gsub(Regexp.new("#{suffix}\.*$"),'') } 
end

puts get_first_part("/path/to/files/", "-y08iPnx_kTA")

答案 2 :(得分:1)

def get_first_part(path, suffix)
  Dir.entries(path).find do |fname|
    File.basename(fname, File.extname(fname)).end_with?(suffix)
  end.split(suffix).first
end

对@Steve Wilhelm的回答进行了扩展 - 除了不使用glob(当我们只使用文件名时不需要它),避免使用正则表达式并使用File.exname(fname)File.basename 1}}调用,因此您不必包含文件扩展名。还返回字符串“This_is_a_very_good_movie”而不是文件数组。

如果找不到文件,这当然会提高..在这种情况下,如果你只是想在找不到匹配时返回nil

def get_first_part(path, suffix)
  file = Dir.entries(path).find do |fname|
    File.basename(fname, File.extname(fname)).end_with?(suffix)
  end
  file.split(suffix).first if file
end

答案 3 :(得分:1)

如果文件名只有一个连字符:

path = '/Users/greg/Desktop/test'
target = 'rb'

def get_files(path, target)
  Dir.chdir(path) do
    return Dir["*#{ target }*"].map{ |f| f.split('-').first }
  end
end

puts get_files(path, 'y08iPnx_ktA')
# >> This_is_a_very_good_movie

如果有多个连字符:

def get_files(path, target)
  Dir.chdir(path) do
    return Dir["*#{ target }*"].map{ |f| f.split(target).first.chop }
  end
end

puts get_files(path, 'y08iPnx_ktA')
# >> This_is_a_very_good_movie

如果假定代码是从包含文件的目录中运行的,则可以删除Dir.chdir,将事情简化为:

puts Dir["*#{ target }*"].map{ |f| f.split('-').first }
# >> This_is_a_very_good_movie

puts Dir["*#{ target }*"].map{ |f| f.split(target).first.chop }
# >> This_is_a_very_good_movie