递归地将所有文件夹和文件名转换为小写或大写

时间:2011-04-06 04:53:16

标签: ruby

我有一个像下面这样的文件夹结构。

-FOO
  -BAG
     Rose.TXT
-BAR
    JaCk.txt

我需要以下输出。

-foo
  -bag
    rose.txt
-bar
    jack.txt

6 个答案:

答案 0 :(得分:8)

我意识到你想要红宝石代码,但是我会向你展示一个在你的shell中运行的衬垫:

for i in `find * -depth`; do (mv $i `echo $i|tr [:upper:] [:lower:]`); done

在此处找到:http://ubuntuforums.org/showthread.php?t=244738

运行一次,它应该可以解决问题。

更新

Ruby代码:

Dir.glob("./**/*").each do |file|
  File.rename(file, file.downcase) #or upcase if you want to convert to uppercase
end

答案 1 :(得分:2)

Dir["**/*"].each {|f| File.rename(f, f.downcase)}

答案 2 :(得分:0)

答案 3 :(得分:0)

您需要的只是Find.find

require 'find'
Find.find(directory) do |path|
    if(path != '.' && path != '..')
        File.rename(path, path.downcase)
    end
end

答案 4 :(得分:0)

如果要以递归方式重命名文件,可以使用**/*

folder = "/home/prince"
Dir["#{folder}/**/*"].each {|file| File.rename(file, file.downcase)}

如果您只想以小写

输出文件数组
Dir["#{folder}/**/*"].map(&:downcase)

答案 5 :(得分:0)

接受的答案不起作用:当它首先尝试转换目录然后转换该目录中的文件时。

以下是可行的代码:

Dir.glob("./**/*").sort{|x| x.size}.each do |name|
  x = name.split('/')
  newname = (x[0..-2] + [x[-1].downcase]).join('/')
  File.rename(name, newname) 
end

(它按长度对列表进行排序,因此将在其中的文件后转换该目录)