[英]How do I get all the files names in one folder using Ruby?
这些在一个文件夹中:
This_is_a_very_good_movie-y08iPnx_ktA.mp4
myMovie2-lKESbDzUwUg.mp4
his_is_another_movie-lKESbDzUwUg.mp4
如何通过给出最后一部分y08iPnx_ktA
从文件中获取字符串mymovie1
的第一部分? 就像是:
get_first_part("y08iPnx_kTA") #=> "This_is_a_very_good_movie"
把问题分成几部分。 get_first_part
方法应该 go 类似于:
使用Dir获取文件列表。
遍历每个文件,并且;
提取“名称”('This_is_a_very_good_movie')和“标签”('y08iPnx_ktA')。 每个文件都应该使用相同的正则表达式。
如果“标签”与正在查找的内容匹配,则返回“名称”。
快乐编码。
在 REPL 中玩耍并玩得开心:-)
它可以做得比这更干净吗? 根据@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")
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(当我们只使用文件名时不需要它),避免使用 Regexp 并使用File.exname(fname)
来调用File.basename
所以你不必包含文件扩展名。 还返回字符串“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
如果文件名只有一个连字符:
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.