Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 递归地将所有文件夹和文件名转换为小写或大写_Ruby - Fatal编程技术网

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

Ruby 递归地将所有文件夹和文件名转换为小写或大写,ruby,Ruby,我有一个文件夹结构,如下所示。 -福 -包 Rose.TXT -酒吧 JaCk.txt 我需要以下输出 -福 -包 rose.txt -酒吧 jack.txt 我知道您需要ruby代码,但我为您提供了一个在shell中运行的一行程序: for i in `find * -depth`; do (mv $i `echo $i|tr [:upper:] [:lower:]`); done 如图所示: 运行它一次,它就会成功 更新 Ruby代码: Dir.glob("./**/*").each

我有一个文件夹结构,如下所示。

-福
-包
Rose.TXT
-酒吧
JaCk.txt

我需要以下输出


-福
-包
rose.txt
-酒吧
jack.txt

我知道您需要ruby代码,但我为您提供了一个在shell中运行的一行程序:

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

运行它一次,它就会成功

更新 Ruby代码:

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

递归目录列表:

大写/小写转换:

享受:)

你只需要一点点:

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

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

folder = "/home/prince"
Dir["#{folder}/**/*"].each {|file| File.rename(file, file.downcase)}
如果只希望文件数组以小写形式输出

Dir["#{folder}/**/*"].map(&:downcase)

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

以下是有效的代码:

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

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

谢谢@Mike。我已经知道shell脚本了。但是,我需要ruby中的代码。谢谢你的帮助<代码>系统(“对于i infind*-depth
;do(mv$i
echo$i | tr[:upper:[:lower:
);done”)
:)@Rein,是的,我也知道诀窍工作。可以通过RUby吗?。请告诉我ruby代码。谢谢,谢谢@SpyrosP。这不是我问题的正确答案。请再读一遍我的问题,为什么不呢?您需要一个目录列表和一种转换upper->lower和viceversa的方法。这两个参考资料描述了如何做到这两个方面。组合它们只需几分钟。您需要像“/foo/bag/rose.txt”这样的文件名还是需要数据结构?不,我只需要将文件夹和文件转换为小写或大写。我不需要返回任何类型的结构。
folder = "/home/prince"
Dir["#{folder}/**/*"].each {|file| File.rename(file, file.downcase)}
Dir["#{folder}/**/*"].map(&:downcase)
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