12

我一直在尝试编写一个基于 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
4

6 回答 6

12

稍作修改的版本:

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而不是使用通配符查找所有内容,然后稍后手动过滤。
  • 在调用中使用entry(即完整的文件名)gsubrename不是origin. origin真的只对.include?测试有用。由于它是文件名的片段,因此不能与rename. 我完全删除了origin变量以避免滥用它的诱惑。

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

于 2012-05-25T17:40:26.440 回答
4

我使用公认的答案来修复一堆复制的文件名。

Dir.glob('./*').sort.each do |entry|
  if File.basename(entry).include?(' copy')
    newEntry = entry.gsub(' copy', '')
    File.rename( entry, newEntry )
  end
end
于 2016-07-18T16:08:39.003 回答
3

您的问题是gets在字符串末尾返回换行符。因此,如果您键入“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
于 2012-05-25T17:27:20.600 回答
1

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

将此保存为 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、...

于 2017-01-04T13:37:14.307 回答
1

我制作了一个小脚本来按季节重命名整个 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

结果将是: 龙珠 Z S05E1 龙珠 Z S05E2 龙珠 Z S05E3

于 2019-10-30T03:06:35.783 回答
0

在文件夹中,我想删除_任何音频文件名的尾随下划线,同时保留其他所有内容。在这里分享我的代码,因为它可能对某人有所帮助。该程序的作用:

  1. 提示用户:
    • 目录路径:(c:/your/path/here确保使用斜杠/,而不是反斜杠,\并且没有最后一个)。
    • 文件扩展名:(mp3不带点.
    • 要删除的尾随字符:_
  2. 查找任何以 结尾的文件c:/your/path/here/filename_.mp3并重命名它c:/your/path/here/filename.mp3,同时保留文件的原始扩展名。

puts 'Enter directory path'

path = gets.strip

directory_path = Dir.glob("#{path}/*")

# Get file extension

puts 'Enter file extension'

file_extension = gets.strip

# Get trailing characters to remove

puts 'Enter trailing characters to remove'

trailing_characters = gets.strip

suffix = "#{trailing_characters}.#{file_extension}"

# Rename file if condition is met

directory_path.each do |file_path|
  next unless file_path.end_with?(suffix)

  File.rename(file_path, "#{file_path.delete_suffix(suffix)}.#{file_extension}")
end
于 2021-11-29T12:53:18.477 回答