NodeJS - 如何将一个文件夹复制到另一个文件夹,只覆盖不同的文件?
NodeJS - How to copy one folder to another, overwriting only files that differ?
问题:
如何在 NodeJS 中将一个文件夹复制到另一个文件夹,只覆盖不同的文件?
关于fs-extra "copy"方法:
copy method from fs-extra 似乎没有跳过相同文件(未进行任何修改)的选项。
有 overwrite
选项,但它只能让您选择在所有情况下覆盖(即使文件相同)或不覆盖(即使文件不同)。
过时的答案。请参阅 Reflect 答案。
我发现 mattijs/node-rsync and jedrichards/rsyncwrapper,在 Linux/Windows*/etc.
为了选择的方便和自由,我决定坚持第二种选择。
示例(自述文件中描述了更多选项)
单个文件:
rsync({
src: "file.txt",
dest: "tmp/file.txt"
},function (error,stdout,stderr,cmd) {
if ( error ) {
// failed
console.log(error.message);
} else {
// success
}
});
完整目录:
rsync({
src: "src-folder/",
dest: "dest-folder",
recursive: true,
exclude: ["*.txt"]
},function (error,stdout,stderr,cmd) {
if ( error ) {
// failed
console.log(error.message);
} else {
// success
}
});
我创建了一个开源的 nodejs 库,名为 Reflect - https://github.com/alumna/reflect
我不满意我之前提到的两个库 都依赖于 rsync 命令,这不是 multi-platform 决定,因为 Windows 不本地不提供 rsync。
我在纯 javascript 中制作了 Reflect 来解决这个问题,不依赖于 rsync 或任何其他库,使其适用于所有操作系统。
注意一下:Reflect比较文件的方式类似于rsync,只同步两个文件夹的不同之处,完全避免了non-modified文件的复制(或修改但仍然相同的文件),但它仍然不适合具有大文件的项目,因为它会在不同时复制整个文件。
安装
$ npm install @alumna/reflect
用法
import reflect from '@alumna/reflect';
let { res, err } = await reflect({
src: 'src/',
dest: 'dest/',
// (OPTIONAL) Default to 'true'
recursive: true,
// (OPTIONAL) Default to 'true'
// Delete in dest the non-existent files in src
delete: true,
// (OPTIONAL)
// Array with files and folders not to reflect
exclude: [ "skip-this-file.txt", "skip/this/directory" ]
});
if ( err )
console.error( err )
else
console.log( res ) // Directory "src/" reflected to "dest/"
我要在这里澄清操作“copy/merge 文件夹”和“sync/mirror 文件夹”之间的区别。
在两个随机文件夹的情况下,如果不读取它们的内容就无法知道两个文件是否相同,修改时间和文件大小等内容可能是巧合。这就是为什么 fs-extra
没有这样的覆盖选项。
如果打算将两个文件夹作为它们的镜像,那么您可能会对它们内部的世界状态更加乐观,并通过比较文件的修改时间并仅复制最近更改的文件来加快速度。但是按照设计,这个解决方案仍然不能 100% 防弹。只是想让你知道:)
问题:
如何在 NodeJS 中将一个文件夹复制到另一个文件夹,只覆盖不同的文件?
关于fs-extra "copy"方法:
copy method from fs-extra 似乎没有跳过相同文件(未进行任何修改)的选项。
有 overwrite
选项,但它只能让您选择在所有情况下覆盖(即使文件相同)或不覆盖(即使文件不同)。
过时的答案。请参阅 Reflect 答案。
我发现 mattijs/node-rsync and jedrichards/rsyncwrapper,在 Linux/Windows*/etc.
为了选择的方便和自由,我决定坚持第二种选择。
示例(自述文件中描述了更多选项)
单个文件:
rsync({
src: "file.txt",
dest: "tmp/file.txt"
},function (error,stdout,stderr,cmd) {
if ( error ) {
// failed
console.log(error.message);
} else {
// success
}
});
完整目录:
rsync({
src: "src-folder/",
dest: "dest-folder",
recursive: true,
exclude: ["*.txt"]
},function (error,stdout,stderr,cmd) {
if ( error ) {
// failed
console.log(error.message);
} else {
// success
}
});
我创建了一个开源的 nodejs 库,名为 Reflect - https://github.com/alumna/reflect
我不满意我之前提到的两个库 都依赖于 rsync 命令,这不是 multi-platform 决定,因为 Windows 不本地不提供 rsync。
我在纯 javascript 中制作了 Reflect 来解决这个问题,不依赖于 rsync 或任何其他库,使其适用于所有操作系统。
注意一下:Reflect比较文件的方式类似于rsync,只同步两个文件夹的不同之处,完全避免了non-modified文件的复制(或修改但仍然相同的文件),但它仍然不适合具有大文件的项目,因为它会在不同时复制整个文件。
安装
$ npm install @alumna/reflect
用法
import reflect from '@alumna/reflect';
let { res, err } = await reflect({
src: 'src/',
dest: 'dest/',
// (OPTIONAL) Default to 'true'
recursive: true,
// (OPTIONAL) Default to 'true'
// Delete in dest the non-existent files in src
delete: true,
// (OPTIONAL)
// Array with files and folders not to reflect
exclude: [ "skip-this-file.txt", "skip/this/directory" ]
});
if ( err )
console.error( err )
else
console.log( res ) // Directory "src/" reflected to "dest/"
我要在这里澄清操作“copy/merge 文件夹”和“sync/mirror 文件夹”之间的区别。
在两个随机文件夹的情况下,如果不读取它们的内容就无法知道两个文件是否相同,修改时间和文件大小等内容可能是巧合。这就是为什么 fs-extra
没有这样的覆盖选项。
如果打算将两个文件夹作为它们的镜像,那么您可能会对它们内部的世界状态更加乐观,并通过比较文件的修改时间并仅复制最近更改的文件来加快速度。但是按照设计,这个解决方案仍然不能 100% 防弹。只是想让你知道:)