2014-01-17 3 views
0

У меня есть файлы, которые называются так:Массовые переименования файлов проблема

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

Я хотел бы переименовать их, разделив базовое имя на строку %26rn% и возвращая индекс 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

'LL = 'item.htm% 3Fid% 3D26184136352% порядка 26RN% 3D490896865329d1a07c116d0fa2ccde83 & USG = ALkJrhhLjeT_LoGV64BkCnaLGgNbCgWAAA.html'' ' ll.split (' % порядка 26RN% '). First' => '" item.htm% 3Fid% 3D26184136352 "' –

+0

Это не решает проблему переименования, спасибо за ваш ввод. – jcuwaz

+0

где проблема? –

ответ

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) 
+0

Что касается полного модифицированного скрипта, включающего каждый; потому что я попытался включить то, что у вас здесь, и все же файлы не переименованы. – jcuwaz

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 vs. 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' ярлык.

Смежные вопросы