Ruby 按扩展名复制文件

Ruby copy file by extension

我正在尝试从 Chef 执行以下命令 Ruby 块并给出以下错误。

FileUtils.cp_r Dir.glob "#{node['default']['home']}/standalone/deployments/'*.ear'", "#{node['default']['default_backup_path']}/my_bkp_#{time}", :noop => true, :verbose => true

ArgumentError: wrong number of arguments (given 3, expected 1..2)

很可能你的 Dir.glob 方法需要括号,它只接受传递的第一个参数,其余的被视为 FileUtils.cp_r 参数,尝试使用:

FileUtils.cp_r(
  Dir.glob(
    "#{node['default']['home']}/standalone/deployments/'*.ear'", 
    "#{node['default']['default_backup_path']}/my_bkp_#{time}"
  ),
  'destination/',
  noop: true,
  verbose: true
)

您将两个 patterns 参数传递给 glob 方法,这就是错误原因:

no implicit conversion of String into Integer (TypeError)

尝试对每个模式只使用 cp_r,例如:

FileUtils.cp_r(
  Dir.glob("#{node['default']['home']}/standalone/deployments/'*.ear'"), 
  'destination/',
  noop: true,
  verbose: true
)

FileUtils.cp_r(
  Dir.glob("#{node['default']['default_backup_path']}/my_bkp_#{time}"),
  'destination/',
  noop: true,
  verbose: true
)

我认为你的目标是迭代获取

中的元素
  • "#{node['default']['home']}/standalone/deployments/'*.ear'"
  • "#{node['default']['default_backup_path']}/my_bkp_#{time}"

因此您可以遍历这两个目录,并在 Dir.glob 方法中使用此模式,例如:

patterns = [
  "#{node['default']['home']}/standalone/deployments/'*.ear'", 
  "#{node['default']['default_backup_path']}/my_bkp_#{time}"
]
patterns.each do |pattern|
  FileUtils.cp_r Dir.glob(pattern), 'destination/', noop: true, verbose: true
end

其中 'destination/' 是元素将被复制到的文件夹,您丢失了。

或者如果您想使用 default_backup_path 文件夹作为目标,则不需要 Dir.glob 方法,只需将其添加为 dest 参数即可,如一个字符串

FileUtils.cp_r(
  Dir.glob("#{node['default']['home']}/standalone/deployments/'*.ear'"),
  "#{node['default']['default_backup_path']}/my_bkp_#{time}",
  noop: true,
  verbose: true
)