@definetool/sync-files

2.1.10 • Public • Published

@definetool/sync-files

基于 MD5 的文件同步工具,把源目录的文件和目录结构同步到目标目录中。

用 MD5 对文件内容进行计算,MD5 值相同的文件被认为是同一个文件,尽管它们的文件名可能不同。
同步后,目标目录的目录结构和文件列表就保持跟源目录完全一致。

同步过程中: 对源目录完全是无伤害的,即不会对源目录有任何的删除、修改、新增文件/目录的操作,仅仅把它当成一个数据源进行读取。
对目标目录可能存在以下操作:

  • 删除多余的文件或目录;当 target 目录有某个文件或目录,而 source 目录没有此文件或目录时。
  • 复制新增的文件或目录;当 source 目录有某个文件或目录,而 target 目录没有此文件或目录时。
  • 重命名已有的文件;当 source 目录有某个文件,target 目录也存在此文件,但对应的目录位置、文件名不同时。

同步过程中,会对源目录和目标目录的文件进行 MD5 计算,为了方便下次可以直接使用本次的计算结果,会在当前的源目录和目标目录创建一个隐藏的子目录 .sync-files 以保存 MD5 的计算结果。

每次计算文件的 MD5 时,都会先从目录 .sync-files 目录读取,如果存在对应的记录,则直接使用,不再重复计算当前文件的 MD5。
如果不存在,则计算当前文件的 MD5 值,并且会把结果缓存起来。 用户可以直接删除 .sync-files 目录,则会重新计算 MD5。

示例

使用默认设置

const { parse, sync, } = require('@definetool/sync-files');

//仅对指定目录进行解析,生成 MD5 元数据库。
parse('/Users/micty/Pictures/Canon');


//进行完整的同步流程,包括解析、同步、清理、校验。
sync({
    //要进行同步的来源目录。
    //不会对此目录有任何的删除、修改等操作,仅仅把它当成数据源进行读取。
    source: '/Users/micty/Pictures/Canon',

    //要进行同步的目标目录。
    //进行同步时,可能会对此目录进行以下操作:
    //一,删除多余的文件;当目标目录有某个文件,而源目录没有此文件时。
    //二,复制新增的文件;当源目录有某个文件,而目标目录没有此文件时。
    //三,重命名已有的文件;当源目录有某个文件,目标目录也存在此文件,但对应的目录位置、文件名不同时。
    target: '/Volumes/3/Canon',
});

自定义方式

const { Task, } = require('@definetool/sync-files');


let config = {
    //解析过程中提取文件 MD5 等元数据后要保存到目录名,建议指定为 `.sync-files/`。
    //如果不指定,则不保存元数据。
    //为了使用下次的解析更快,建议开启缓存。
    //此目录是在 source 和 target 对应的目录中。
    cache: '.sync-files/',

    //要进行同步的来源目录。
    //同步过程中不会对此目录有任何的删除、修改等操作,仅仅把它当成数据源进行读取。
    //如果指定了 cache 字段,则会在此目录中生成 cache 目录。
    source: '/Users/micty/Pictures/Canon',

    //要进行同步的目标目录。
    //进行同步时,可能会对此目录进行以下操作:
    //一,删除多余的文件;当目标目录有某个文件,而源目录没有此文件时。
    //二,复制新增的文件;当源目录有某个文件,而目标目录没有此文件时。
    //三,重命名已有的文件;当源目录有某个文件,目标目录也存在此文件,但对应的目录位置、文件名不同时。
    //如果指定了 cache 字段,则会在此目录中生成 cache 目录。
    target: '/Volumes/3/Canon',

    patterns: [
        // '**/*.*',        //匹配 `文件名.后缀名`,但不匹配 `.后缀名` 和 `文件名`。
        '**/*',             //匹配 `文件名.后缀名`、`文件名`、`文件名.`,但不匹配 `.后缀名`。 即匹配所有含有文件名的文件。
        '**/.*',            //匹配 `.后缀名`,即匹配只含有后缀名的文件。
        '!**/.DS_Store',    //排除 `.DS_Store` 文件。 
        '!**/Thumbs.db',    //排除 `Thumbs.db` 文件。
    ],


    output: {
        //会话过程中产生的日志等临时文件的存放目录。 
        //建议每次都使用一个不同的目录,以方便多次运行后进行查找和对比。
        //如果不指定,则不输出临时文件。
        dir: `./output/2021-12-21/`,  

        //会话过程中产生的日志的文件名称。 
        //如果指定,则输出到此文件中;否则仅在控制台输出。
        //此文件名是在 home 目录中。
        console: 'console.log',

        //同步文件与目录过程,target 目录中要被删除的文件与目录在删除前,
        //可以先复制到此目录作为备份,以避免误删。
        deletes: 'deletes/',

        //调用 task.parse() 方法时要输出的结果路径。
        parse: `parse.{type}.json`,

        //调用 task.compare() 方法时要输出的结果路径。
        compare: `compare.{type}.json`,

        //调用 task.sync() 方法时要输出的结果路径。
        sync: `sync.{type}.json`,

    },
  
};

let task = new Task(config);
let { source, target, } = task.parse();
let compare = task.compare({ source, target, });
let sync = task.sync({ source, target, compare, });

// return { source, target, compare, sync, };

Readme

Keywords

none

Package Sidebar

Install

npm i @definetool/sync-files

Weekly Downloads

2

Version

2.1.10

License

MIT

Unpacked Size

278 kB

Total Files

72

Last publish

Collaborators

  • micty