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