1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187
|
# Usage Examples
```js
copy: {
main: {
files: [
// includes files within path
{expand: true, src: ['path/*'], dest: 'dest/', filter: 'isFile'},
// includes files within path and its sub-directories
{expand: true, src: ['path/**'], dest: 'dest/'},
// makes all src relative to cwd
{expand: true, cwd: 'path/', src: ['**'], dest: 'dest/'},
// flattens results to a single level
{expand: true, flatten: true, src: ['path/**'], dest: 'dest/', filter: 'isFile'},
],
},
},
```
This task supports all the file mapping format Grunt supports. Please read [Globbing patterns](http://gruntjs.com/configuring-tasks#globbing-patterns) and [Building the files object dynamically](http://gruntjs.com/configuring-tasks#building-the-files-object-dynamically) for additional details.
Here are some additional examples, given the following file tree:
```shell
$ tree -I node_modules
.
├── Gruntfile.js
└── src
├── a
└── subdir
└── b
2 directories, 3 files
```
**Copy a single file tree:**
```js
copy: {
main: {
expand: true,
src: 'src/*',
dest: 'dest/',
},
},
```
```shell
$ grunt copy
Running "copy:main" (copy) task
Created 1 directories, copied 1 files
Done, without errors.
$ tree -I node_modules
.
├── Gruntfile.js
├── dest
│ └── src
│ ├── a
│ └── subdir
└── src
├── a
└── subdir
└── b
5 directories, 4 files
```
**Copying without full path:**
```js
copy: {
main: {
expand: true,
cwd: 'src',
src: '**',
dest: 'dest/',
},
},
```
```shell
$ grunt copy
Running "copy:main" (copy) task
Created 2 directories, copied 2 files
Done, without errors.
$ tree -I node_modules
.
├── Gruntfile.js
├── dest
│ ├── a
│ └── subdir
│ └── b
└── src
├── a
└── subdir
└── b
5 directories, 5 files
```
**Flattening the filepath output:**
```js
copy: {
main: {
expand: true,
cwd: 'src/',
src: '**',
dest: 'dest/',
flatten: true,
filter: 'isFile',
},
},
```
```shell
$ grunt copy
Running "copy:main" (copy) task
Copied 2 files
Done, without errors.
$ tree -I node_modules
.
├── Gruntfile.js
├── dest
│ ├── a
│ └── b
└── src
├── a
└── subdir
└── b
3 directories, 5 files
```
**Copy and modify a file:**
To change the contents of a file as it is copied, set an `options.process` function as follows:
```js
copy: {
main: {
src: 'src/a',
dest: 'src/a.bak',
options: {
process: function (content, srcpath) {
return content.replace(/[sad ]/g,"_");
},
},
},
},
```
Here all occurrences of the letters "s", "a" and "d", as well as all spaces, will be changed to underlines in "a.bak". Of course, you are not limited to just using regex replacements.
To process all files in a directory, the `process` function is used in exactly the same way.
NOTE: If `process` is not working, be aware it was called `processContent` in v0.4.1 and earlier.
### Troubleshooting
By default, if a file or directory is not found it is quietly ignored. If the file should exist, and non-existence generate an error, then add `nonull:true`. For instance, this Gruntfile.js entry:
```js
copy: {
main: {
nonull: true,
src: 'not-there',
dest: 'create-me',
},
},
```
gives this output:
```shell
$ grunt copy
Running "copy:main" (copy) task
Warning: Unable to read "not-there" file (Error code: ENOENT). Use --force to continue.
Aborted due to warnings.
```
|