Comparing version
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 |
Minified code
QualityThis package contains minified code. This may be harmless in some cases where minified code is included in packaged libraries, however packages on npm should not minify code.
Found 1 instance in 1 package
AI-detected possible typosquat
Supply chain riskAI has identified this package as a potential typosquat of a more popular package. This suggests that the package may be intentionally mimicking another package's name, description, or other metadata.
Found 1 instance in 1 package
Minified code
QualityThis package contains minified code. This may be harmless in some cases where minified code is included in packaged libraries, however packages on npm should not minify code.
Found 1 instance in 1 package
94518
0.58%1883
0.48%0
-100%17
13.33%64
-11.11%