Files
TransferSu/README.md
T

108 lines
3.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# TransferSu - 统一文件传输工具
基于 rsync / rclone / pv+tar 的统一拷贝管理工具,CLI/TUI 双模式,实时日志轮转。
## 特性
- **多后端**: rsync(推荐, 断点续传)/ rclone(并行)/ pv+tar(零依赖)
- **CLI/TUI 双模式**: 未显式 `--mode cli` 时默认 TUI 启动
- **TUI 四栏布局**:
- 上栏: 总进度条 + 单文件进度条
- 中栏: 速度曲线可视化(最近 80 秒采样)
- 下栏: 文件日志 + 错误日志 双面板
- 底部: 交互输入栏(可空启动后设定任务)
- **实时日志**: 写入本地目录, 滚动保留最近 N 个(默认 20), 文件名含纳秒时间戳
- **可控性**: 限速 / 断点续传 / 校验 / 并行数 全部可配
## 安装
```bash
pip install -i https://mirrors.aliyun.com/pypi/simple/ pytest textual
```
## 用法
```bash
# TUI 模式 (默认): 空启动后在底部输入栏设定任务
python3 transfer.py
# TUI 模式带预设任务
python3 transfer.py /src /dst --bwlimit 30000
# CLI 模式 (显式指定)
python3 transfer.py --mode cli /src/ /dst/ --backend rclone --bwlimit 8M
```
### TUI 输入栏命令
```
/src /dst --backend rclone --bwlimit 8M --transfers 4 # 启动传输任务
help # 帮助
clear # 清空日志面板
quit # 退出
```
### 参数
| 参数 | 默认 | 说明 |
|---|---|---|
| `--backend` | rsync | rsync / rclone / tar |
| `--bwlimit` | 30000 | 限速 (rsync: KB/s, rclone: 如 8M) |
| `--transfers` | 4 | rclone 并行传输数 |
| `--resume` / `--no-resume` | 开 | rsync 断点续传 |
| `--checksum` | 关 | rsync 校验模式 |
| `--verify` | 关 | 完成后校验(rsync -c dry-run,0 差异=一致) |
| `--retry` | 0 | 失败自动补传轮数(配合守护自动恢复设备) |
| `--mode` | tui | cli / tui |
| `--keep-logs` | 20 | 日志滚动保留数 |
| `--logdir` | ~/logs | 日志目录 |
## 日志
- 目录: `--logdir` 指定(默认 `~/logs`)
- 文件名: `{时间戳}_{后端}_{源名}.log`(时间戳开头保证排序即时间序)
- 滚动: 超过 `--keep-logs` 个自动删除最旧
## 测试
```bash
python3 -m pytest tests/ -q
```
## 冲突策略(覆盖/跳过)
传输前可用参数预设策略,或中途逐项决策:
| 参数 | 行为 |
|---|---|
| `--overwrite` | 覆盖已存在文件(默认) |
| `--skip` | 跳过已存在文件(`--ignore-existing`) |
| `--ask` | 逐项询问(扫描冲突后交互) |
**ask 交互选项**(CLI 与 TUI 一致):
```
y = 覆盖当前项 n = 跳过当前项
a = 全部覆盖 s = 全部跳过
q = 中止传输
```
- **CLI**:预扫描后逐项提示,输入 y/n/a/s/q
- **TUI**:扫描完成后在底部输入栏逐项交互(stats 栏显示当前冲突文件)
- **仅当前/后续同步**:y/n 只作用于当前文件;a/s 一次决定后续所有冲突
- rsync 覆盖场景自动禁用 `--append`(追加模式会阻止重写),保留 `--partial`
- rclone 的 `--ask` 使用原生 `--interactive`(y/n/s);tar 后端不支持 ask/skip
```bash
# CLI 示例: ask 交互 + 补传 + 校验
python3 transfer.py --mode cli --policy ask --retry 5 --verify /src/ /dst/
# TUI 输入栏示例
/src /dst --policy ask --retry 5 --verify
/src /dst --skip
```
> `--retry` 在传输失败(掉卡等)后自动重跑补传,`--verify` 完成后用
> `rsync -c --dry-run` 全量校验(无输出=源目标完全一致),适合读卡器
> 掉卡频繁的场景。