如何在ruby中批量重命名文件

如何在ruby中批量重命名文件,ruby,Ruby,我一直在尝试开发一个基于ruby的文件重命名程序,作为我自己的编程练习(我知道在linux下重命名,但我想学习ruby,而重命名在Mac中不可用) 从下面的代码来看,问题是.include?方法总是返回false,即使我看到文件名包含这样的搜索模式。如果我注释掉include?复选框,gsub()似乎根本不会生成新的文件名(即文件名保持不变)。有人能看看我做错了什么吗?提前多谢 以下是预期的行为: 假设当前文件夹中有三个文件:a1.jpg、a2.jpg和a3.jpg Ruby脚本应该能够将其重命

我一直在尝试开发一个基于ruby的文件重命名程序,作为我自己的编程练习(我知道在linux下重命名,但我想学习ruby,而重命名在Mac中不可用)

从下面的代码来看,问题是
.include?
方法总是返回false,即使我看到文件名包含这样的搜索模式。如果我注释掉
include?
复选框,
gsub()
似乎根本不会生成新的文件名(即文件名保持不变)。有人能看看我做错了什么吗?提前多谢

以下是预期的行为: 假设当前文件夹中有三个文件:a1.jpg、a2.jpg和a3.jpg Ruby脚本应该能够将其重命名为b1.jpg、b2.jpg、b3.jpg

#!/Users/Antony/.rvm/rubies/ruby-1.9.3-p194/bin/ruby

puts "Enter the file search query"
searchPattern = gets
puts "Enter the target to replace"
target = gets
puts "Enter the new target name"
newTarget = gets
Dir.glob("./*").sort.each do |entry|
  origin = File.basename(entry, File.extname(entry))
  if origin.include?(searchPattern)
    newEntry = origin.gsub(target, newTarget)
    File.rename( origin, newEntry )
    puts "Rename from " + origin + " to " + newEntry
  end
end

您的问题是,
get
在字符串末尾返回一个换行符。因此,如果键入“foo”,则
searchPattern
将变成
“foo\n”
。最简单的修复方法是:

searchPattern = gets.chomp

我可能会稍微重写您的代码:

$stdout.sync
print "Enter the file search query: "; search  = gets.chomp
print "Enter the target to replace: "; target  = gets.chomp
print "  Enter the new target name: "; replace = gets.chomp
Dir['*'].each do |file|
  # Skip directories
  next unless File.file?(file)
  old_name = File.basename(file,'.*')
  if old_name.include?(search)
    # Are you sure you want gsub here, and not sub?
    # Don't use `old_name` here, it doesn't have the extension
    new_name = File.basename(file).gsub(target,replace)
    File.rename( file, new_path )
    puts "Renamed #{file} to #{new_name}" if $DEBUG
  end
end

略加修改的版本:

puts "Enter the file search query"
searchPattern = gets.strip
puts "Enter the target to replace"
target = gets.strip
puts "Enter the new target name"
newTarget = gets.strip
Dir.glob(searchPattern).sort.each do |entry|
  if File.basename(entry, File.extname(entry)).include?(target)
    newEntry = entry.gsub(target, newTarget)
    File.rename( entry, newEntry )
    puts "Rename from " + entry + " to " + newEntry
  end
end
主要区别:

  • 使用
    .strip
    删除从
    gets
    获取的尾随换行符。否则,此换行符将打乱所有匹配尝试
  • glob
    调用中使用用户提供的搜索模式,而不是对所有内容进行全局搜索,然后在以后手动筛选
  • 在调用
    gsub
    rename
    时使用
    entry
    (即完整的文件名),而不是
    origin
    <代码>原点仅对
    测试有用。包括?
    测试。由于它是文件名的一个片段,因此不能与
    重命名
    一起使用。我完全删除了
    origin
    变量,以避免滥用它

对于您的示例文件夹结构,在三个输入提示(分别)中输入
*.jpg
a
b
,应该按照您的预期重命名文件。

我使用接受的答案修复了一堆复制文件的名称

Dir.glob('./*').sort.each do |entry|
  if File.basename(entry).include?(' copy')
    newEntry = entry.gsub(' copy', '')
    File.rename( entry, newEntry )
  end
end

这是我今天使用的一个简短版本(没有模式匹配)

将此文件另存为rename.rb文件,并在命令提示符下使用ruby rename.rb运行它

count = 1
newname = "car"
Dir["/path/to/folder/*"].each do |old|
  File.rename(old, newname + count.to_s)
  count += 1
end

我将_MG_2435.JPG的/Copy转换为car1、car2、

我制作了一个小脚本,按季节重命名整个DBZ系列,并实现了以下功能:

count = 1
new_name = "Dragon Ball Z S05E"
format_file = ".mkv"
Dir.glob("dragon ball Z*").each do |old_name|
  File.rename(old_name, new_name + count.to_s + format_file)
  count += 1
end
结果将是: 龙珠ZS05E1 龙珠Z S05E2
龙珠Z S05E3

您为三个
获取
提示提供了什么输入?我认真地认为
重命名
命令可以做得更好…@texasbruce,mac中没有重命名命令。也许macports有些东西,但只找到了一堆perl脚本。但正如我之前所建议的,这是一个ruby练习me@Antony对你有好处;)我以前试过,但最后调用了rename…更进一步,也许你想在gem中封装一些文件实用程序函数并发布它。我真的对ruby提供的文件和目录库感到不安。现在不是在一个文件前面,但是
mv“old location”“new location”
在MacOS终端中不起作用??啊!谢谢你的解释。至少从文档(ruby doc.org)来看,它似乎显示了strip(删除前导和尾随的空格)和chomp(删除换行符),所以我最终使用get.chomp.strip,希望这不是过度使用。不管怎样,这个脚本工作得很好@安东尼-换行符是Ruby认为的“空白”的一部分,所以做
chomp
strip
都是多余的
strip
做了
chomp
所做的一切,还有更多。感谢您指出chomp。每天学习新东西。你要发送到文件中的参数“new_path”在哪里。重命名设置?也许你指的是文件。改名(文件,新名称)?否则,我会给这个+1