代码之家  ›  专栏  ›  技术社区  ›  Paulo Coghi

如何将一个文件夹复制到另一个文件夹,只覆盖不同的文件?

  •  1
  • Paulo Coghi  · 技术社区  · 7 年前

    问题是:


    关于fs extra“copy”方法:

    copy 方法来自 fs-extra 没有跳过相同文件(未经过任何修改)的选项。

    overwrite 选项,但它仅允许您选择在所有情况下覆盖,即使文件相同,或不覆盖,即使文件不同。

    3 回复  |  直到 7 年前
        1
  •  1
  •   Paulo Coghi    4 年前

    我创建了一个开源的nodejs库,名为 反映 - https://github.com/alumna/reflect

    我对我前面提到的两个图书馆感到不满意 取决于rsync

    为了解决这个问题,我用纯javascript制作了Reflect,它不依赖rsync或任何其他库,因此适用于所有操作系统。

    请注意: Reflect将文件与rsync进行类似的比较,只同步两个文件夹之间的差异,完全避免复制未修改的文件(或已修改但仍然相同的文件),但它仍然不适用于具有大文件的项目,因为它在文件不同时复制整个文件。


    安装

    $ 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/"
    
        2
  •  1
  •   Paulo Coghi    4 年前

    过时的答案。请参见反映答案。


    我找到了 mattijs/node-rsync jedrichards/ rsyncwrapper ,在Linux中运行良好/ 窗户

    为了方便和自由选择,我决定坚持第二种选择。


    示例 (自述文件中介绍了更多选项)

    单个文件:

    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
        }
    });
    
        3
  •  0
  •   Jakub Szwacz    3 年前

    对于两个随机文件夹,如果不读取其内容,就无法知道两个文件是否相同,例如修改时间和文件大小可能是巧合。这就是为什么 fs-extra 没有这样的覆盖选项。

    如果两个文件夹是它们的镜像,那么您可能会对其中的世界状态更乐观,并通过比较文件的修改时间和只复制最近更改的文件来加快速度。但从设计上看,这个解决方案并不是百分之百防弹的。让你知道:)