使用 Grunt.js 将所有文件从目录复制到另一个目录

Posted

技术标签:

【中文标题】使用 Grunt.js 将所有文件从目录复制到另一个目录【英文标题】:Copy all files from directory to another with Grunt.js copy 【发布时间】:2013-09-28 18:38:01 【问题描述】:

作为构建过程的一部分,我正在尝试将目录中的所有文件复制到另一个目录。它适用于我明确指定的单个文件,但是当我尝试复制整个目录时,它会做一些奇怪的事情,比如复制完整的目录结构(或根本不复制)。这是我的 GruntFile.js 中的相关部分:

copy: 
  myvoice: 
    files: [
       src:"src/html/index.html", dest:"dist/myvoice/index.html" ,
       src:"src/html/css/style.css", dest:"dist/myvoice/css/style.css" ,
       src:"src/html/js/require.js", dest:"dist/myvoice/js/require.js" ,
       src:"build/myvoice/main.js", dest:"dist/myvoice/js/main.js" ,
       src:"src/html/css/fonts/*", dest:"dist/myvoice/css/fonts/" 
    ]
  
,

具体来说,这是我无法工作的最后一行:

       src:"src/html/css/fonts/*", dest:"dist/myvoice/css/fonts/" 

【问题讨论】:

【参考方案1】:

如果您正在使用 angular yeoman 进行开发,那么这是使用 grunt 进行复制的更好方法。 expand: 使用 cwd 时需要 true。 只是应用程序路由 ('.')。

 
    expand: true,
     cwd: '<%= yeoman.app %>/data',
     dest: '<%= yeoman.dist %>/data',
     src: ['**']
    

【讨论】:

虽然这段代码 sn-p 可以解决问题,但including an explanation 确实有助于提高帖子的质量。请记住,您正在为将来的读者回答问题,而这些人可能不知道您的代码建议的原因。也请尽量不要用解释性 cmets 挤满你的代码,因为这会降低代码和解释的可读性!【参考方案2】:

文件段必须使用 egdy 而不是花括号(在 Coffeescript 中)...

copy: 
  files: [
    cwd: 'path/to/files'
    src: '**/*'
    dest: 'dist/files'
    expand: true
  ]

【讨论】:

【参考方案3】:

我想补充一点,在 src 中更改 glob 的格式将修改副本的工作方式。

正如上面 bmoeskau 所指出的,以下内容将复制dist/ 内的everything 并将其移动到path/to/dir(如果目标已存在,则覆盖它)。

copy: 
  files: 
    expand: true,
    dest: 'path/to/dir',
    cwd: 'dist/',
    src: '**'
  

但请注意:

copy: 
  files: 
    expand: true,
    dest: 'path/to/dir',
    cwd: 'dist/',
    src: '*'
  

只会复制dist/ 内的文件以及目录,但不会将这些目录的内容复制到目标位置。

此外,带有src: '*/*' 的以下内容将复制包含dist/ 内容的目录。也就是说,dist/ 内的文件不会被复制。

copy: 
  files: 
    expand: true,
    dest: 'path/to/dir',
    cwd: 'dist/',
    src: '*/*'
  

最后,与上面相同,但src: '**/**' 复制dist/ 内的文件以及dist/ 子目录内的文件到path/to/dir。所以目的地内不会有文件夹。

copy: 
  files: 
    expand: true,
    dest: 'path/to/dir',
    cwd: 'dist/',
    src: '*/*',
    flatten: true,
    filter: 'isFile'
  

【讨论】:

很好的解释! +1 比github上的文档好,我喜欢例子 +1 星数的含义是否有约定,例如** 总是表示文件和目录,* 只是文件? @Imray 来自bash manual:两个相邻的*s 用作单个模式将匹配所有文件以及零个或多个目录和子目录乙>。如果后跟/,则两个相邻的*s 将仅匹配目录和子目录 ** 匹配一切,而**/ 目录和子目录(不是文件)。【参考方案4】:

this answer 中的 flatten: true 选项可能适用于某些情况,但在我看来,更常见的要求(如我的情况)是按原样复制文件夹及其子文件夹结构, 到dest。似乎在大多数情况下,如果您有子文件夹,它们可能会在代码中以这种方式被引用。这样做的关键是cwd 选项,它将保留相对于指定工作目录的文件夹结构:

copy: 
  files: 
    cwd: 'path/to/files',  // set working folder / root to copy
    src: '**/*',           // copy all files and subfolders
    dest: 'dist/files',    // destination folder
    expand: true           // required when using cwd
  

【讨论】:

谢谢——你说得对,这个答案更像是我问这个问题时所寻找的。我已经学会了处理上一个答案引起的扁平化,但这很烦人。 我为此损失了一个多小时...如果您使用cwd选项,请务必转expand:true。如果不设置expand:true,cwd将无法正常工作。 我必须确保目录路径以“/”结尾并添加 flatten: false 才能正常工作。 **/* 这就是我一直在寻找的东西,我正在使用**谢谢伙计。【参考方案5】:

如果您指定文件 glob,此任务将维护文件夹结构。你想要的是 flatten 选项,它将删除结构。


    expand: true,
    flatten: true,
    src: ['src/html/css/fonts/**'],
    dest: 'dist/myvoice/css/fonts/',
    filter: 'isFile'

在Github repo 中查找其余可用选项。希望这会有所帮助。

【讨论】:

以上是关于使用 Grunt.js 将所有文件从目录复制到另一个目录的主要内容,如果未能解决你的问题,请参考以下文章

linux 怎样复制一个目录的所有文件到另一个目录

linux下怎么把一个文件复制到另一个文件夹

将一个Linux系统中的文件或文件夹复制到另一台Linux服务器上(scp的使用)

如何在熊猫数据框中的所有列中搜索模式,并在找到时将其复制到另一列

linux 从一台机器复制文件到另一台linux机器上去

将文件从多个(指定)文件夹路径复制到另一个目录,同时保持文件结构