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

Ant*_*ony 10 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
Run Code Online (Sandbox Code Playgroud)

bta*_*bta 11

略有修改版本:

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
Run Code Online (Sandbox Code Playgroud)

主要差异:

  • 使用.strip删除尾随换行符,你从中获取gets.否则,这个换行符会搞砸你所有的匹配尝试.
  • glob调用中使用用户提供的搜索模式而不是为所有内容进行通配,然后在以后手动过滤它.
  • entry在调用中使用(即完整的文件名)gsubrename不是origin. origin实际上只对.include?测试有用.由于它是文件名的片段,因此无法使用rename.我origin完全删除了变量,以避免滥用它的诱惑.

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