我有一组文件夹(在一个文件夹中),所有文件夹都需要根据其内容重命名。
具体来说,我想将“/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
答案 0 :(得分:1)
假设my_file
由extension
选择,有人可能会这样做:
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
此行在累加器哈希上分配一个新元素,用旧文件夹名称替换旧文件夹名称。