我的文件名如下:
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."
这不起作用,我不确定原因。
答案 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."
这不能保证有效,但看起来是正确的。
不要使用单字母变量,除了你计算的短循环;传统上我们在这种情况下使用i
,j
,k
等。为了您的使用,请使用更能说明变量内容的内容,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)