基于Ruby中的内容递归重命名文件夹

时间:2016-03-02 05:17:57

标签: ruby rename

我有一组文件夹(在一个文件夹中),所有文件夹都需要根据其内容重命名。

具体来说,我想将“/working_directory/my_folder/my_file.extension”重命名为/working_directory/my_file/my_file.extension“

/ my_folder /中还有一些其他文件。我如何使用ruby以递归方式执行此操作?

我是ruby和编程的新手,我已经尝试过提取文件名,但运气不好。尝试通过文件夹进行迭代。每次调用Find.find时,这将循环通过/ working_directory /。目的是搜索/ working_directory / my_folder /仅用于扩展名为.fls的文件。

require 'find'
Path = "/working_directory/"
Dir.foreach(Path) do |file|
 puts file
 new_dir = Path+file
 puts new_dir
 Find.find(new_dir) do |i| # this is intended to by /working_directory/my_folder/
  fls_file << i if i =~ /.*\.fls$/
  puts fls_file
  end
end

1 个答案:

答案 0 :(得分:1)

假设my_fileextension选择,有人可能会这样做:

Dir["/working_directory/**/*"].select do |dir_or_file|
  File.directory? dir_or_file # select only directories, recursively
end.inject({}) do |memo, dir|
  new_name = Dir["#{dir}/*.extension"].to_a
  unless new_name.size == 1 # check if the folder contains only one proper file
    puts "Multiple/No choices; can not rename dir [#{dir}] ⇒ skipping..."
    next memo # skip if no condition met
  end
  my_file = new_name.first[/[^\/]+(?=\.extension\z)/] # get my_name
  memo[dir] = dir.gsub /[^\/]+(?=\/#{myfile}\.extension\z)/, my_file
  memo
end.each do |old, neu|
  # dry run to make sure everything is OK 
  puts "Gonna rename #{old} to #{neu}"
  # uncomment the lines below as you are certain the code works properly
  # neu_folder = neu[/(.*?)([^\/]+\z)/, 1]
  # FileUtils.mkdir neu_folder unless File.exist? neu_folder
  # FileUtils.mv old, neu # rename
end

为了以前的迭代器一致性,在主处理之后完成重命名,可能在这种情况下可能在前一个循环中完成,而不是将old: neu对注入到哈希中并稍后迭代它。

我们在这里大量使用带有regexp的字符串解析。

  my_file = new_name.first[/[^\/]+(?=\.extension\z)/] # get my_name

这一行通过解析字符串的尾部获得一个新的文件夹名称,不包含斜杠并且跟踪'.extension\z'(请参阅正向前瞻。)

  memo[dir] = dir.gsub /[^\/]+(?=\/#{myfile}\.extension\z)/, my_file

此行在累加器哈希上分配一个新元素,用旧文件夹名称替换旧文件夹名称。