一个 C++23 实用工具集合项目,包含两个独立的命令行工具。
本项目包含两个实用的命令行工具,用于文件系统操作和目录管理:
- folder_similarity - 使用 Levenshtein 距离算法比较文件夹名称相似度
- oldsort - 按最后修改时间排序并列出目录
- C++23 支持的编译器(如 GCC 13+ 或 Clang 16+)
- Make 构建工具
make这将编译两个可执行文件:folder_similarity 和 oldsort。
比较文件夹名称的相似度,使用 Levenshtein 距离算法计算相似度。
用法:
./folder_similarity [OPTIONS] [directory1 [directory2 ...]]选项:
-s <threshold>- 设置相似度阈值(0.0 ~ 1.0,默认:0.9)-h- 显示帮助信息
示例:
# 比较当前目录下的子文件夹(默认阈值 0.9)
./folder_similarity
# 设置自定义相似度阈值
./folder_similarity -s 0.8
# 比较指定目录
./folder_similarity /path/to/dir1 /path/to/dir2算法特性:
- 使用优化的 Levenshtein 距离算法,空间复杂度为 O(min(n,m))
- 支持同时比较多个目录
- 只显示相似度 >= 阈值的文件夹对
递归遍历目录并按最后修改时间排序(从旧到新)。
用法:
./oldsort [OPTIONS] [directory]选项:
-l <number>- 限制输出最老的 N 个目录(默认:不限制)-0- 使用空字符作为分隔符(用于与 xargs 等工具管道结合)-h- 显示帮助信息
示例:
# 列出当前目录下所有文件夹,按修改时间从旧到新排序
./oldsort
# 只显示最老的 5 个文件夹
./oldsort -l 5
# 使用空字符分隔符输出(便于管道处理)
./oldsort -0 | xargs -0 ls -ld
# 指定目录
./oldsort /path/to/directory特性:
- 预计算时间戳,避免重复文件系统调用
- 自动跳过无权限访问的目录
- 支持与其他工具管道结合
两个工具都采用了以下优化策略:
- 使用现代 C++23 特性(
std::expected、std::ranges、std::filesystem) - 优化的算法实现(Levenshtein 距离空间优化)
- 使用
std::from_chars替代异常抛出的字符串解析 - 使用
std::unordered_map实现 O(1) 查找 - 预计算数据避免重复操作
make clean- 函数名使用下划线命名法(snake_case)
- 使用
namespace fs = std::filesystem;简化文件系统操作 - 添加
[[nodiscard]]属性到返回值重要的函数
- 使用
std::expected类型定义错误处理框架 - 统一的错误消息格式
- 向
std::cerr输出错误信息 - 使用适当的返回码(0 表示成功,非 0 表示失败)
- 使用
getopt函数解析参数 - 提供清晰的帮助信息(
-h选项) - 参数验证和错误处理
本项目为示例项目,可自由使用和修改。