Socket
Socket
Sign inDemoInstall

hlink

Package Overview
Dependencies
Maintainers
1
Versions
82
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

hlink - npm Package Compare versions

Comparing version 1.0.0 to 1.0.1

2

lib/bins/main/help.js
import chalk from "chalk";
export default "\nQQ\u53CD\u9988\u7FA4\u53F7\uFF1A".concat(chalk.cyanBright('807101297'), "\n\n\u7528\u6CD5:\n $ hlink [--Options] [sourceDir] destPath\n\n\u5B50\u547D\u4EE4:\n ").concat(chalk.gray('备份hlink目录缓存等 备份路径'), "\n $ hlink backup /path/to/back\n ").concat(chalk.gray('还原hlink目录缓存等 还原路径'), "\n $ hlink restore /path/to/restore\n ").concat(chalk.gray('移除命令查看帮助'), "\n $ hlink rm --help\n\n\u53EF\u914D\u7F6E\u9009\u9879:\n --saveMode,-s \u4FDD\u5B58\u6A21\u5F0F,\u9ED8\u8BA4\u4E3A\u6A21\u5F0F0\n ").concat(chalk.gray("saveMode=1 \u4FDD\u5B58\u4E00\u7EA7\u76EE\u5F55\n saveMode=0 \u4FDD\u5B58\u539F\u6709\u7684\u76F8\u5BF9\u6E90\u5730\u5740\u7684\u8DEF\u5F84"), "\n\n --includeExtname,-i \u5305\u542B\u7684\u6269\u5C55\u540D,\u591A\u4E2A\u7528','\u9694\u5F00\n ").concat(chalk.gray("\u5982\u679C\u4E0D\u914D\u7F6E\u8BE5\u9879,\u4F1A\u91C7\u7528\u4EE5\u4E0B\u7B56\u7565\n 1. \u914D\u7F6E\u4E86excludeExtname,\u5219\u94FE\u63A5\u6587\u4EF6\u4E3A\u6392\u9664\u540E\u7684\u5176\u4ED6\u6587\u4EF6\n 2. \u672A\u914D\u7F6EexcludeExtname,\u5219\u94FE\u63A5\u6587\u4EF6\u4E3A\u76EE\u5F55\u4E0B\u7684\u6240\u6709\u6587\u4EF6"), "\n\n --excludeExtname,-e \u6392\u9664\u7684\u6269\u5C55\u540D,\u591A\u4E2A\u7528','\u9694\u5F00\u5982\u679C\u914D\u7F6E\u4E86").concat(chalk.cyan('includeExtname'), "\u5219\u8BE5\u914D\u7F6E\u65E0\u6548\n\n --mkdirIfSingle,-m \u662F\u5426\u4E3A\u72EC\u7ACB\u6587\u4EF6\u521B\u5EFA\u540C\u540D\u6587\u4EF6\u5939,\u9ED8\u8BA4\u4E3Atrue,\u4F1A\u521B\u5EFA\n\n --openCache,-o \u662F\u5426\u6253\u5F00\u7F13\u5B58,\u9ED8\u8BA4\u4E3Afalse, \u4E0D\u4F1A\u4F1A\u6253\u5F00\n ").concat(chalk.gray('打开后,每次硬链后会把对应文件存入缓存,就算下次删除硬链,也不会进行硬链'), "\n\n --configPath,-c \u6307\u5B9A\u914D\u7F6E\u6587\u4EF6\u8DEF\u5F84,\u8BF7\u4F7F\u7528\u7EDD\u5BF9\u8DEF\u5F84\n --generateConfig,-g \u751F\u6210config\u6587\u4EF6,\u53EF\u4EE5\u4F7F\u7528 hlink -g \u67E5\u770B\u8DEF\u5F84\n --removeConfig,-r \u5220\u9664\u914D\u7F6E\u6587\u4EF6\n\n\u4F8B\u5B50:\n ").concat(chalk.grey('# 创建 /share/download 下面文件到目标地址 /share/movie'), "\n $ hlink /share/download /share/movie\n ").concat(chalk.grey('# 生成配置文件'), "\n $ hlink -g");
export default "\nQQ\u53CD\u9988\u7FA4\u53F7\uFF1A".concat(chalk.cyanBright('807101297'), "\n\n\u7528\u6CD5:\n hlink [--Options] [sourceDir] destPath\n\n\u5B50\u547D\u4EE4:\n ").concat(chalk.gray('备份hlink目录缓存等 备份路径'), "\n hlink backup /path/to/back\n ").concat(chalk.gray('还原hlink目录缓存等 还原路径'), "\n hlink restore /path/to/restore\n ").concat(chalk.gray('移除命令查看帮助'), "\n hlink rm --help\n\n\u53EF\u914D\u7F6E\u9009\u9879:\n --saveMode,-s \u4FDD\u5B58\u6A21\u5F0F,\u9ED8\u8BA4\u4E3A\u6A21\u5F0F0\n ").concat(chalk.gray("saveMode=1 \u4FDD\u5B58\u4E00\u7EA7\u76EE\u5F55\n saveMode=0 \u4FDD\u5B58\u539F\u6709\u7684\u76F8\u5BF9\u6E90\u5730\u5740\u7684\u8DEF\u5F84"), "\n\n --includeExtname,-i \u5305\u542B\u7684\u6269\u5C55\u540D,\u591A\u4E2A\u7528','\u9694\u5F00\n ").concat(chalk.gray("\u5982\u679C\u4E0D\u914D\u7F6E\u8BE5\u9879,\u4F1A\u91C7\u7528\u4EE5\u4E0B\u7B56\u7565\n 1. \u914D\u7F6E\u4E86excludeExtname,\u5219\u94FE\u63A5\u6587\u4EF6\u4E3A\u6392\u9664\u540E\u7684\u5176\u4ED6\u6587\u4EF6\n 2. \u672A\u914D\u7F6EexcludeExtname,\u5219\u94FE\u63A5\u6587\u4EF6\u4E3A\u76EE\u5F55\u4E0B\u7684\u6240\u6709\u6587\u4EF6"), "\n\n --excludeExtname,-e \u6392\u9664\u7684\u6269\u5C55\u540D,\u591A\u4E2A\u7528','\u9694\u5F00\u5982\u679C\u914D\u7F6E\u4E86").concat(chalk.cyan('includeExtname'), "\u5219\u8BE5\u914D\u7F6E\u65E0\u6548\n\n --mkdirIfSingle,-m \u662F\u5426\u4E3A\u72EC\u7ACB\u6587\u4EF6\u521B\u5EFA\u540C\u540D\u6587\u4EF6\u5939,\u9ED8\u8BA4\u4E3Atrue,\u4F1A\u521B\u5EFA\n\n --openCache,-o \u662F\u5426\u6253\u5F00\u7F13\u5B58,\u9ED8\u8BA4\u4E3Afalse, \u4E0D\u4F1A\u4F1A\u6253\u5F00\n ").concat(chalk.gray('打开后,每次硬链后会把对应文件存入缓存,就算下次删除硬链,也不会进行硬链'), "\n\n --configPath,-c \u6307\u5B9A\u914D\u7F6E\u6587\u4EF6\u8DEF\u5F84,\u8BF7\u4F7F\u7528\u7EDD\u5BF9\u8DEF\u5F84\n --generateConfig,-g \u751F\u6210config\u6587\u4EF6,\u53EF\u4EE5\u4F7F\u7528 hlink -g \u67E5\u770B\u8DEF\u5F84\n --removeConfig,-r \u5220\u9664\u914D\u7F6E\u6587\u4EF6\n\n\u4F8B\u5B50:\n ").concat(chalk.grey('# 创建 /share/download 下面文件到目标地址 /share/movie'), "\n hlink /share/download /share/movie\n ").concat(chalk.grey('# 生成配置文件'), "\n hlink -g");
import chalk from 'chalk';
export default "\nQQ\u53CD\u9988\u7FA4\u53F7\uFF1A".concat(chalk.cyanBright('807101297'), "\n\n\u7528\u6CD5:\n hlink prune /path/to/source1,/path/to/source2 /path/to/dest1,/path/to/dest2\n\n\u8BF4\u660E:\n \u8BE6\u7EC6\u8BF4\u660E\u89C1 https://github.com/likun7981/hlink/blob/master/docs/prune.md\n\n\u6CE8\u610F:\n \u56E0\u4E3A\u6211\u4EEC\u91C7\u7528 ").concat(chalk.cyan(',(英文逗号)'), " \u6765\u8FDB\u884C\u591A\u9879\u8F93\u5165\u3002\n \u6240\u4EE5\u4F60\u7684\u8DEF\u5F84\u4E00\u5B9A\u4E0D\u8981\u5305\u542B ").concat(chalk.cyan(',(英文逗号)'), "\u3002\n \u5426\u5219\u4F1A\u5BFC\u81F4\u672A\u77E5\u9519\u8BEF\uFF0C\u540E\u679C\u81EA\u8D1F~\n\n\u7528\u6CD5:\n ").concat(chalk.gray('# 修剪多余硬链文件'), "\n $ hlink prune sourceDir1,sourceDir2 destDir1,destDir2\n ").concat(chalk.gray('# 修剪多余硬链并删除所在目录'), "\n $ hlink prune -p sourceDir1,sourceDir2 destDir1,destDir2\n ").concat(chalk.gray('# 修剪时无需确认,一般使用于计划任务'), "\n $ hlink prune -w sourceDir1,sourceDir2 destDir1,destDir2\n\n\u53EF\u914D\u7F6E\u9009\u9879:\n --pruneDir,-p \u662F\u5426\u5220\u9664\u6587\u4EF6\u53CA\u6240\u5728\u76EE\u5F55\uFF0C\u9ED8\u8BA4\u53EA\u4F1A\u5220\u9664\u6587\u4EF6\n ").concat(chalk.gray('如果你指定了该选项则会删除文件及所在目录'), "\n\n --withoutConfirm,-w \u5220\u9664\u524D\u662F\u5426\u9700\u786E\u8BA4? \u9ED8\u8BA4\u9700\u8981\u786E\u8BA4\u3002\n ").concat(chalk.gray('如果你使用计划任务,建议设置为无需确认'), "\n ").concat(chalk.gray('Windows Git Bash不支持提示,所以会直接删除,执行前确认好'), "\n\n --includeExtname,-i \u68C0\u6D4B\u5305\u542B\u7684\u540E\u7F00\u540D\uFF0C\u540Chlink --help\u4E2D\u7684includeExtname\u4E00\u6837\n --excludeExtname,-e \u68C0\u6D4B\u6392\u9664\u7684\u540E\u7F00\u540D\uFF0C\u540Chlink --help\u4E2D\u7684excludeExtname\u4E00\u6837\n\n --reverse,-r \u68C0\u6D4B\u65B9\u5411\uFF0C\u9ED8\u8BA4\u662F\u6B63\u5411\u68C0\u6D4B\uFF0C\u5982\u679C\u4F60\u6307\u5B9A\u4E86\u8BE5\u9009\u9879\u5219\u4F1A\u662F\u53CD\u5411\u68C0\u6D4B\n ").concat(chalk.gray("1. \u6B63\u5411\u68C0\u6D4B\uFF1A\u5220\u9664\u7684\u662F\u786C\u94FE\u76EE\u5F55\u7684\u6587\u4EF6\uFF0C\u4FEE\u526A\u786C\u94FE\u76EE\u5F55\u6BD4\u6E90\u76EE\u5F55\u591A\u7684\u6587\u4EF6\u3002\n ".concat(chalk.cyan('注意:正向检测一定要列全所有的源目录'), "\n 2. \u53CD\u5411\u68C0\u6D4B\uFF1A\u5220\u9664\u7684\u662F\u6E90\u76EE\u5F55\u76EE\u5F55\u7684\u6587\u4EF6\uFF0C\u4FEE\u526A\u6E90\u76EE\u5F55\u6BD4\u786C\u94FE\u76EE\u5F55\u591A\u7684\u6587\u4EF6\u3002\n ").concat(chalk.cyan('注意:反向检测一定要列全所有的硬链目录,hlink会帮你排除缓存的文件'))), "\n");
export default "\nQQ\u53CD\u9988\u7FA4\u53F7\uFF1A".concat(chalk.cyanBright('807101297'), "\n\n\u7528\u6CD5:\n hlink prune /path/to/source1,/path/to/source2 /path/to/dest1,/path/to/dest2\n\n\u8BF4\u660E:\n \u8BE6\u7EC6\u8BF4\u660E\u89C1 https://github.com/likun7981/hlink/blob/master/docs/prune.md\n\n\u6CE8\u610F:\n \u56E0\u4E3A\u6211\u4EEC\u91C7\u7528 ").concat(chalk.cyan(',(英文逗号)'), " \u6765\u8FDB\u884C\u591A\u9879\u8F93\u5165\u3002\n \u6240\u4EE5\u4F60\u7684\u8DEF\u5F84\u4E00\u5B9A\u4E0D\u8981\u5305\u542B ").concat(chalk.cyan(',(英文逗号)'), "\u3002\n \u5426\u5219\u4F1A\u5BFC\u81F4\u672A\u77E5\u9519\u8BEF\uFF0C\u540E\u679C\u81EA\u8D1F~\n\n\u7528\u6CD5:\n ").concat(chalk.gray('# 修剪多余硬链文件'), "\n hlink prune sourceDir1,sourceDir2 destDir1,destDir2\n ").concat(chalk.gray('# 修剪多余硬链并删除所在目录'), "\n hlink prune -p sourceDir1,sourceDir2 destDir1,destDir2\n ").concat(chalk.gray('# 修剪时无需确认,一般使用于计划任务'), "\n hlink prune -w sourceDir1,sourceDir2 destDir1,destDir2\n\n\u53EF\u914D\u7F6E\u9009\u9879:\n --pruneDir,-p \u662F\u5426\u5220\u9664\u6587\u4EF6\u53CA\u6240\u5728\u76EE\u5F55\uFF0C\u9ED8\u8BA4\u53EA\u4F1A\u5220\u9664\u6587\u4EF6\n ").concat(chalk.gray('如果你指定了该选项则会删除文件及所在目录'), "\n\n --withoutConfirm,-w \u5220\u9664\u524D\u662F\u5426\u9700\u786E\u8BA4? \u9ED8\u8BA4\u9700\u8981\u786E\u8BA4\u3002\n ").concat(chalk.gray('如果你使用计划任务,建议设置为无需确认'), "\n ").concat(chalk.gray('Windows Git Bash不支持提示,所以会直接删除,执行前确认好'), "\n\n --includeExtname,-i \u68C0\u6D4B\u5305\u542B\u7684\u540E\u7F00\u540D\uFF0C\u540Chlink --help\u4E2D\u7684includeExtname\u4E00\u6837\n --excludeExtname,-e \u68C0\u6D4B\u6392\u9664\u7684\u540E\u7F00\u540D\uFF0C\u540Chlink --help\u4E2D\u7684excludeExtname\u4E00\u6837\n\n --reverse,-r \u68C0\u6D4B\u65B9\u5411\uFF0C\u9ED8\u8BA4\u662F\u6B63\u5411\u68C0\u6D4B\uFF0C\u5982\u679C\u4F60\u6307\u5B9A\u4E86\u8BE5\u9009\u9879\u5219\u4F1A\u662F\u53CD\u5411\u68C0\u6D4B\n ").concat(chalk.gray("1. \u6B63\u5411\u68C0\u6D4B\uFF1A\u5220\u9664\u7684\u662F\u786C\u94FE\u76EE\u5F55\u7684\u6587\u4EF6\uFF0C\u4FEE\u526A\u786C\u94FE\u76EE\u5F55\u6BD4\u6E90\u76EE\u5F55\u591A\u7684\u6587\u4EF6\u3002\n ".concat(chalk.cyan('注意:正向检测一定要列全所有的源目录'), "\n 2. \u53CD\u5411\u68C0\u6D4B\uFF1A\u5220\u9664\u7684\u662F\u6E90\u76EE\u5F55\u7684\u6587\u4EF6\uFF0C\u4FEE\u526A\u6E90\u76EE\u5F55\u6BD4\u786C\u94FE\u76EE\u5F55\u591A\u7684\u6587\u4EF6\u3002\n ").concat(chalk.cyan('注意:反向检测一定要列全所有的硬链目录,hlink会帮你排除缓存的文件'))), "\n");

@@ -10,4 +10,6 @@ import lsirf from "./lsirf.js";

if (Boolean(file) && !file.endsWith('/') && !file.endsWith(':')) {
var inode = parseFilePath(file)[0];
inodes.push(inode);
var result = parseFilePath(file);
if (result) {
inodes.push(result[0]);
}
}

@@ -14,0 +16,0 @@ });

import path from 'path';
import fs from 'fs-extra';
var endsWithes = ['*', '@'];
var allNumber = /^[0-9]+$/;
/**

@@ -24,4 +25,7 @@ * @description 解析出inode及绝对路径

}
if (!allNumber.test(inode)) {
return false;
}
return [inode, filepath];
}
export default parseFilePath;

@@ -27,7 +27,10 @@ import path from 'path';

prevIsBlank = false;
var _a = parseFilePath(file, currentDir), inode = _a[0], fullPath = _a[1];
results.push({
inode: inode,
fullPath: fullPath
});
var result = parseFilePath(file, currentDir);
if (result) {
var inode = result[0], fullPath = result[1];
results.push({
inode: inode,
fullPath: fullPath
});
}
}

@@ -34,0 +37,0 @@ });

{
"name": "hlink",
"version": "1.0.0",
"version": "1.0.1",
"description": "hlink",

@@ -11,8 +11,8 @@ "license": "MIT",

},
"type": "module",
"bin": {
"hlink": "./lib/cli.js"
},
"type": "module",
"engines": {
"node": ">=12"
"node": ">=14.16"
},

@@ -29,3 +29,5 @@ "scripts": {

"np:beta": "np --tag=beta --any-branch --no-cleanup --no-tests --no-yarn",
"np:next": "np --tag=next --any-branch --no-cleanup --no-tests --no-yarn"
"np:next": "np --tag=next --any-branch --no-cleanup --no-tests --no-yarn",
"docs:dev": "vitepress dev docs",
"docs:build": "vitepress build docs"
},

@@ -69,4 +71,6 @@ "files": [

"typescript": "^4.6.4",
"vitepress": "^0.22.4",
"vue": "^3.2.36",
"xo": "^0.24.0"
}
}

@@ -0,22 +1,33 @@

<p align="center">
<a href="https://hlink.likun.me" target="_blank" rel="noopener noreferrer">
<img width="180" src="https://hlink.likun.me/logo.svg" alt="hlink logo">
</a>
</p>
<p align="center">
<a href="https://www.npmjs.com/package/hlink"><img src="https://img.shields.io/npm/v/hlink.svg" alt="npm package"></a>
<a href="https://nodejs.org/en/about/releases/"><img src="https://img.shields.io/node/v/hlink.svg" alt="node compatibility"></a>
<a href="https://npmjs.com/package/hlink"><img src="https://img.shields.io/npm/dm/hlink.svg" alt="downloads"></a>
<a href="https://github.com/likun7981/hlink/blob/master/LICENSE"><img src="https://img.shields.io/npm/l/hlink.svg" alt="license"></a>
</p>
# hlink
> 批量、快速硬链工具(The batch, fast hard link toolkit)
[![npm package][npm]][npm-url]
[![node version][node]][node-url]
[![npm download][npm-download]][npm-download-url]
- 💡 重复检测:支持文件名变更的重复检测
- ⚡️ 快速:`20000+`文件只需要1分钟
- 📦 多平台:支持Windows、Mac、Linux
- 🛠️ 丰富的配置:支持黑白名单,缓存等多个配置
- 🔩 修剪机制:让你更方便的同步源文件和硬链
## 所需环境:
Node.js 12.20 或者 Node.js 14.14及以上
更多介绍:https://hlink.likun.me
## 安装
```bash
$ npm install -g hlink
npm install -g hlink
# 查看帮助
$ hlink --help
hlink --help
```
## 与`cp -lr`的优势功能:
1. 重复硬链检测,就算硬链接已改名也能检查到(内容改了不行)
2. 更好的硬链删除机制
3. 更友好的的提示

@@ -30,10 +41,4 @@ ## 使用

## 教程
- [威联通开机启动添加环境变量](./docs/qnap.md)
## 打赏作者
## 更新日志
- [新版本0.6.x改动](https://github.com/likun7981/hlink/pull/42)
# 打赏作者
请作者喝一杯咖啡😄

@@ -43,4 +48,2 @@

打赏列表:
- 脱光游侠/诈尸求邀没结果 `16.60 RMB`

@@ -61,14 +64,3 @@ - 月与徘徊 `10.00 RMB`

[MIT][license-url]
[MIT](https://github.com/likun7981/hlink/blob/master/LICENSE)
[npm]: https://img.shields.io/npm/v/hlink.svg
[npm-url]: https://www.npmjs.com/package/hlink
[node]: https://img.shields.io/node/v/hlink.svg
[node-url]: https://nodejs.org
[npm-download-url]: https://npmjs.com/package/hlink
[npm-download]: https://img.shields.io/npm/dm/hlink.svg
[license-url]: https://github.com/likun7981/hlink/blob/master/LICENSE
[license]: http://img.shields.io/npm/l/hlink.svg?style=flat
SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc