从数组中按字符串重命名文件?

时间:2016-06-12 06:38:48

标签: ruby regex

我有一组字符串对。 例如:[["vendors", "users"], ["jobs", "venues"]]

我有一个目录中的文件列表:

folder/
  -478_accounts
  -214_vendors
  -389_jobs

我需要以某种方式使用子数组中的第二个值重命名文件,所以它看起来像这样:

folder/
  -478_accounts
  -214_users
  -389_venues

如何解决问题?

1 个答案:

答案 0 :(得分:2)

folder = %w| -478_accounts -214_vendors -389_jobs |
  #=> ["-478_accounts", "-214_vendors", "-389_jobs"] 
h = [["vendors", "users"], ["jobs", "venues"]].to_h
  #=> {"vendors"=>"users", "jobs"=>"venues"} 

r = Regexp.union(h.keys)
folder.each { |f| File.rename(f, f.sub(r,h)) if f =~ r }

我使用String#sub的形式使用哈希进行替换。

您可能希望优化正则表达式以要求替换字符串以跟随下划线并位于字符串的末尾。

r = /
    (?<=_)                  # match an underscore in a positive lookbehind
    #{Regexp.union(h.keys)} # match one of the keys of `h`
    \z                      # match end of string
    /x                      # free-spacing regex definition mode
#=> /
#   (?<=_)                  # match an underscore in a positive lookbehind
#   (?-mix:vendors|jobs) # match one of the keys of `h`
#   \z                      # match end of string
#   /x 

您不必使用正则表达式。

keys = h.keys
folder.each do |f|
  prefix, sep, suffix = f.partition('_')
  File.rename(f, prefix+sep+h[suffix]) if sep == '_' && keys.include?(suffix)
end