2013-03-11 76 views
0

我有文件夾>子文件夾存儲* html.erb文件,我需要重命名爲* .haml擴展名。重命名多個* .html.erb文件

\folder 
    \folder 
    \*html.erb 
    \*html.erb 
    \*html.erb 
    \*html.erb 
    \folder 
    \ ### 
    \ ### 
    \ ### 
    \folder 

我想爲此任務專門使用Ruby腳本。
到目前爲止,我有以下Ruby腳本:

f_p = "/home/ocean/Documents/testr/" 
Dir.glob(f_p + "*").sort.each do |f| 
    filename = File.basename(f, File.extname(f)) 
    puts filename 
end 

但只打印擴展的第一部分,然後我需要以某種方式正確地將其重命名?

回答

2

在Ruby中,

dir_root = "./folder" 
Dir.glob(File.join(dir_root, "/**/*")).sort.each do |file| 
    if file.match(/\.html\.erb$/) 
    File.rename(file, file.gsub(/html\.erb/, "haml")) 
    end 
end 

不是在Ruby中,但在擊與重命名命令:

rename 's/\.html\.erb$/\.haml/' folder/*/*.html.erb 
+0

我已經糾正了我的代碼感謝@ warantesbr的答案。取而代之的是在基本名稱上進行測試,我對整個文件名使用了「匹配」。 – toch 2013-03-11 11:35:32

+0

完美的解決方案,謝謝你們! – 2013-03-11 12:40:07

2

由TOCH提供的答案几乎是正確的,但它有幾個問題:

  1. 主要問題是,如果「erb」(方法extname只返回最後一個段)包含「html.erb」,則重命名的條件是測試永遠不會是真的;
  2. 小問題是,重命名時使用的正則表達式不是轉義點,也不是測試行的末尾;

所以我決定讓這些ajusts:

base_dir = "./views" 
Dir.glob(File.join(base_dir, "/**/*")).sort.each do |file| 
    File.rename(file, file.gsub(/html\.erb$/, "haml")) if File.basename(file) =~ /html\.erb$/ 
end 
+0

感謝您的更正! – toch 2013-03-11 11:36:22