按扩展名复制 Ruby 文件



我正在尝试从 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
参数

错误:错误的参数数量(给定 3,预期为 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方法,这就是错误的原因:

没有将字符串隐式转换为整数(类型错误)

尝试对每种模式只使用 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
)

最新更新