如何使用目录结构复制文件glob

时间:2017-01-04 16:17:16

标签: ruby glob file-copying

我想复制选定的构建产品,保留它们的目录结构部分,但是:

Dir.chdir('build/sources/ios_src') {
  FileUtils.cp_r(Dir.glob('build/Build/Products/*/*.app*'), '/tmp/bcsh')
}

结果

Errno::ENOENT: No such file or directory @ dir_s_mkdir - /tmp/bcsh/Booble.app

尽管全球都回归了这个:

Dir.chdir('build/sources/ios_src') {
  Dir.glob('build/Build/Products/*/*.app*')
}
 => ["build/Build/Products/Calabash-iphonesimulator/Booble.app",
     "build/Build/Products/Calabash-iphonesimulator/Booble.app.dSYM"] 

我希望/tmp/bsch/build/Build/Products/.../Booble.app.../Booble.app.dSYM不是/tmp/bcsh/Booble.app/tmp/bcsh/Booble.app.dSYM

为了清楚起见,我能够创建一个目录,但更有用的错误表明文件最终会在我不想要它们的地方结束。

2 个答案:

答案 0 :(得分:0)

嗯。感谢mudasobwa关于glob的暗示。这似乎复制了glob的结果,保留了glob的目录结构和每个条目:

Dir.chdir('build/sources/ios_src') {
  Dir.glob('build/Build/Products/*/*.app*') { |file|
    dest = File.dirname("/tmp/bcsh/#{file}")
    FileUtils.mkdir_p(dest) && FileUtils.cp_r(file, dest)
  }
}

不热衷于临时,但

.... { |file|
  FileUtils.cp_r(file, FileUtils.mkdir_p(File.dirname("/tmp/bcsh/#{file}")).first)
}

有点极端。

答案 1 :(得分:0)

Dir.chdir('build/sources/ios_src') do
  Dir.glob('build/Build/Products/*/*.app*') do |filename|
    dir = File.join("/tmp/bcsh", *filename.split(File::SEPARATOR)[0...-1])

    FileUtils.mkdir_p(dir)
    FileUtils.cp(filename, dir)
  end
end