在第一行的基础上重命名目录中的每个文件

时间:2014-06-30 18:51:36

标签: ruby file rename

从Ruby开始并尝试创建一个简单的重命名Ruby脚本。假设我有一个目录,其中包含随机文件名的简历:Resume0001,Resume0012,Resume9123,Res_430。一般来说,起始名称并不重要。

我希望我的脚本接收每个文件并重命名(或创建一个新文件),并将文件名作为简历所有者的名称。我理解这当然取决于简历布局,但是,我假设第一行只包含那个人的名字。

根据我所知,我可以通过手动输入参数(文件)来重命名它们。如果我只有5张简历可以做,那就没关系了。当我尝试向脚本提供大约10,000个简历的目录时,我的问题出现了。

这是我到目前为止所做的:

puts "Renaming files..."

Dir.glob("Resumes") do |f|
    File.rename(f, f.readline())
end

puts "Renaming complete."

我有几个想法,为什么这不起作用/事情我不确定:

  1. f只是一个字符串,而不是文件对象,这就是readline()无法处理它的原因。 (编辑:f == filename,而不是对实际文件对象的引用)

  2. 我也遇到私有方法错误。如果我尝试类似

    的话,也会发生这种情况

    first_line = f.readline() File.rename(f, first_line)

    我很难理解私有方法错误到底是什么。

  3. 我不完全确定指定目录路径的工作原理。所以,让我们说我的.rb文件位于documents\name\resume_converter\converter.rb。如果我的简历目录也在resume_converter文件夹(resume_converter\Resumes)中,我会在Dir.glob("Resumes")中指定它吗?如果它是另一个更深的文件怎么办? resume_converter\Dummy_folder\Resumes => Dir.glob("Dummy_folder\Resumes")

  4. 我正在尝试做什么的框架支持?我没有实用的Rails /框架知识,但我想在使用框架之前已经完成了这样的任务?

  5. 所以是的,我被卡住了。

1 个答案:

答案 0 :(得分:0)

这样的事情应该有效:

require 'fileutils'

Dir.glob("Resumes/*").each do |f|
  name = File.open(f).readlines.first.strip # Strip off any whitespace or trailing newlines
  FileUtils.mv(f, "Resumes/#{name}")
end