gpt4 book ai didi

ruby - 如何使用 Ruby 复制文件并根据它们的原始目录重命名它们?

转载 作者:行者123 更新时间:2023-12-03 11:13:31 24 4
gpt4 key购买 nike

我有很多目录,里面有一般命名的 txt 文件。我想复制 txt 文件,根据每个文件的包含目录重命名它们,然后将它们移动到父目录(即包含保存原始 txt 文件的目录的目录,在脚本中指定为“txts”以下)。我想在原始目录中保留原始 txt 文件及其原始名称,以便原始目录中的任何内容都不会更改。

我有一个旧脚本,我认为它曾经实现(部分)我的目标,可能是移动而不是复制原始 txt 文件,但我现在无法成功运行它:

require 'find'
require 'fileutils'

Find.find("txts") do |path|
if FileTest.directory?(path)
next
end

ret = path.scan(/.*txts\/([^\/]+)\/.*/)
name = ret[0].to_s + ".txt"
FileUtils.mv(path, name)
end

多年前,一位 friend 写了这篇文章,并在 unix 环境中成功运行它。当我现在运行它时,会返回大量错误。我正在使用 Ruby 2.2.2,完全有可能在某个地方有一个占位符,我太陌生了,无法识别,或者可能是旧版本的 FileUtils 发生了一些变化……我真的不知道,恐怕我一直无法用我的新手技能找到任何答案。

所以我呼吁你...

编辑:这是错误消息:
C:/Ruby22/lib/ruby/2.2.0/fileutils.rb:1328:in `stat': Invalid argument @ rb_file
_s_stat - ["may2013"].txt (Errno::EINVAL)
from C:/Ruby22/lib/ruby/2.2.0/fileutils.rb:1328:in `lstat'
from C:/Ruby22/lib/ruby/2.2.0/fileutils.rb:1247:in `exist?'
from C:/Ruby22/lib/ruby/2.2.0/fileutils.rb:519:in `block in mv'
from C:/Ruby22/lib/ruby/2.2.0/fileutils.rb:1570:in `block in fu_each_src
_dest'
from C:/Ruby22/lib/ruby/2.2.0/fileutils.rb:1586:in `fu_each_src_dest0'
from C:/Ruby22/lib/ruby/2.2.0/fileutils.rb:1568:in `fu_each_src_dest'
from C:/Ruby22/lib/ruby/2.2.0/fileutils.rb:516:in `mv'
from extracttxt.rb:12:in `block in <main>'
from C:/Ruby22/lib/ruby/2.2.0/find.rb:48:in `block (2 levels) in find'
from C:/Ruby22/lib/ruby/2.2.0/find.rb:47:in `catch'
from C:/Ruby22/lib/ruby/2.2.0/find.rb:47:in `block in find'
from C:/Ruby22/lib/ruby/2.2.0/find.rb:42:in `each'
from C:/Ruby22/lib/ruby/2.2.0/find.rb:42:in `find'
from extracttxt.rb:6:in `<main>'

最佳答案

错误消息显示 ret[0]是数组[ "may13" ] , 所以 ret[0].to_s + ".txt"计算结果为字符串 ["may13"].txt .我不确定,但可能是 String#scan 的行为在 Ruby 1.9 或 2.0 中进行了更改,因此当存在捕获时它返回一个数组数组,而之前它返回一个字符串数组。

这样的事情应该可以解决问题:

require 'find'
require 'fileutils'

Find.find("txts") do |path|
if FileTest.directory?(path)
next
end

if path =~ %r{txts/([^/]+)/}
FileUtils.cp(path, "#{$1}.txt")
end
end

如果您想通过文件扩展名进行匹配,您可以将其添加到上面的正则表达式中(例如 %r{txts/([^/]+)/.+\.txt$} )或者您可以使用 Dir[] (又名 Dir.glob )例如:
require 'dir'
require 'fileutils'

Dir['txts/**/*.txt'].each do |path|
next if FileTest.directory?(path) ||
next unless path =~ %r{txts/([^/]+)/}

FileUtils.cp(path, "#{$1}.txt")
end

我不知道是否会有任何性能差异,但可能值得一试。

关于ruby - 如何使用 Ruby 复制文件并根据它们的原始目录重命名它们?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29956603/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com