我有许多目录,其中包含通用名称的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
几年前,一个朋友写了这篇文章,并在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
如果要按文件扩展名进行匹配,则可以将其添加到上述Regexp中(例如%r{txts/([^/]+)/.+\.txt$}
),也可以使用Dir[]
(aka 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
我不知道是否会有任何性能差异,但是可能值得尝试。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句