批量重命名文件问题

时间:2014-01-17 14:50:46

标签: ruby file rename

我的文件名如下:

item.htm%3Fid%3D26184136352%26rn%3D490896865329d1a07c116d0fa2ccde83&usg=ALkJrhhLjeT_LoGV64BkCnaLGgNbCgWAAA.html`

我想通过在字符串%26rn%上拆分basename并返回0索引来重命名它们,以便所需的文件名为:item.htm%3Fid%3D26184136352.html

我把这样的重命名脚本放在一起:

puts "Renaming files..."
Dir.glob("localhost/Users/Admin/Desktop/html/*.html").each {|i|
  File.rename(i, "localhost/Users/Admin/Desktop/html/#{File.basename(i).split('%26rn%')[0]}.html")
}
puts "Renaming complete."

这不起作用,我不确定原因。

2 个答案:

答案 0 :(得分:1)

考虑这个(未经测试的)代码:

BASE_PATH = 'localhost/Users/Admin/Desktop/html'

puts "Renaming files..."

Dir.glob(File.join(BASE_PATH, '*.html')).each do |old_filename|
  new_filename = File.join(
    BASE_PATH,
    File.basename(old_filename)[/^(.+?)%26rn%/, 1] + '.html'
  )
  File.rename(old_filename, new_filename)
end

puts "Renaming complete."

这不能保证有效,但看起来是正确的。

不要使用单字母变量,除了你计算的短循环;传统上我们在这种情况下使用ijk等。为了您的使用,请使用更能说明变量内容的内容,old_filename告诉我们的内容远远超过i

此外,请勿split字符串,按照您的意图行事并抓住字符串的第一部分,直至%26rn%标记:

foo = 'item.htm%3Fid%3D26184136352%26rn%3D490896865329d1a07c116d0fa2ccde83&usg=ALkJrhhLjeT_LoGV64BkCnaLGgNbCgWAAA.html'
foo[/^(.+?)%26rn%/, 1] # => "item.htm%3Fid%3D26184136352"

从那里你可以看到这里发生了什么:

BASE_PATH = 'localhost/Users/Admin/Desktop/html'

old_filename = 'item.htm%3Fid%3D26184136352%26rn%3D490896865329d1a07c116d0fa2ccde83&usg=ALkJrhhLjeT_LoGV64BkCnaLGgNbCgWAAA.html'
old_filename[/^(.+?)%26rn%/, 1] # => "item.htm%3Fid%3D26184136352"

new_filename = File.join(
  BASE_PATH,
  File.basename(old_filename)[/^(.+?)%26rn%/, 1] + '.html'
)
new_filename # => "localhost/Users/Admin/Desktop/html/item.htm%3Fid%3D26184136352.html"

注意:File.join知道用于* nix与Windows的正确路径分隔符,Ruby将use backslashes or forward-slashes as appropriate。写这个更正确:

BASE_PATH = File.join( %w[ localhost Users Admin Desktop html ] )
# => "localhost/Users/Admin/Desktop/html"

如果您想要跨平台兼容性,但出于示例的目的,我使用了'localhost/Users/Admin/Desktop/html'快捷方式。

答案 1 :(得分:0)

我对RegEx并不擅长所以我会做如下:

file ='item.htm%3Fid%3D26184136352%26rn%3D490896865329d1a07c116d0fa2ccde83&usg=ALkJrhhLjeT_LoGV64BkCnaLGgNbCgWAAA.html'
base_name = File.basename(file)
ext_name = File.extname(file)
new_name = base_name[0..base_name.index('%26rn%')-1] + ext_name
# => "item.htm%3Fid%3D26184136352.html"
File.rename(file,new_name)