2

我在 Windows 7 机器上有一个深度嵌套的文件夹结构。Windows 拒绝删除目录,因为它们的名称太长。我想将所有子文件夹重命名为类似2的东西,希望它足够短,可以删除。这是我的脚本:

@count = 0

Dir.glob("**/*") do |file|  #find src files in current folder and all subfolders
  if File.directory?(file)
    File.rename(file, File.dirname(file) + File::SEPARATOR + "2")
    @count += 1
  end
end

puts @count

当脚本运行时,它不是重命名所有子目录,而是多更改一个子目录,每次逐渐深入一层。即,此时运行脚本的输出是:

C:\>renamer.rb
30
C:\>renamer.rb
31
C:\>renamer.rb
32

我对为什么会发生这种情况感到困惑,并希望有任何意见。

我采取了正确的方法吗?我假设 Ruby 的递归目录删除方法会失败。但是,当我尝试执行

require "FileUtils"
FileUtils.remove_dir ("2", force = true)

我得到错误

syntax error, unexpected ',', expecting ')'
FileUtils.remove_dir ("2", force = true)
                          ^
syntax error, unexpected ')', expecting end-of-input
FileUtils.remove_dir ("2", force = true)
                                    ^
4

1 回答 1

2

问题是Dir.glob("**/*")返回一个这样的数组:

['folder', 'folder/sub', 'folder/sub/sub']

现在当你这样做时:

File.rename(file, File.dirname(file) + File::SEPARATOR + "2")

它将重命名folder,但是当它到达时folder/sub,它不再存在,因为您已重命名folder2:它将2/sub代替folder/sub. 解决方案是反转数组。这会在最深层次上开始重命名过程,并一直到顶层:

Dir.glob("**/*").reverse.each do |file|
  # rest of your code can stay the same
end

至于你的第二个问题,而不是:

FileUtils.remove_dir ("2", force = true)

你应该使用:

FileUtils.remove_dir("2", true)

首先,确保和之间没有空格。这就是导致错误的原因。remove_dir(

也是force参数的名称,默认为false. 这就是您force = false 在 API 中看到的原因。如果你想force成为true可以简单地传递true给函数,就像我上面展示的那样。

于 2013-09-04T11:01:18.770 回答