跳转到内容
RSSTelegramYouTubeFacebookXGitHub

FDC,Rust 构建的文件分类整理工具

🗂️ 一个快速、优雅的 Rust 命令行工具,用于让 macOS 与 Linux 文件夹保持整洁(计划支持 Windows)。 它会按 年份类型 对源目录的一级项进行归类,避免覆盖冲突,保留顶层结构,并允许在进行任何破坏性更改前先预览

TL;DR: cargo install fine-directory-curatorfdc --dry-run → 审阅 → fdc 无需折腾,不会重复覆盖,也不用再问“我的下载去哪儿了?”



因为现实是:下载文件夹会被塞满、发生命名冲突、并且递归工具有风险。 fdc 故意有明确设计取向:

  • 浅且安全:仅处理源目录的第一层内容。目录作为整体移动,不会递归深入修改。
  • 年份优先:时间是“该文件放在哪儿”的最佳主键。
  • 不覆盖:如果冲突则生成 name (1).ext, name (2).ext 等,而不是覆盖已有文件。
  • 先预览:使用 --dry-run 可查看将要发生的改动。
  • 快速且跨平台:用 Rust 编写,在 macOS 与 Linux 上运行良好。

cargo install fine-directory-curator
# 可执行文件将安装在 PATH 中,名称为:
fdc

注意:包名为 fine-directory-curator,二进制可执行文件名为 fdc

# 在仓库根目录下
cargo build --release
# 二进制文件路径:
./target/release/fdc

# 查看帮助
fdc --help

# 使用默认(source: ~/Downloads, target: ~/Documents/Matrixs)
fdc

# 仅预览(不做任何修改)
fdc --dry-run

# 指定源与目标
fdc -s ~/Downloads -t ~/Documents/Matrixs

# 仅在配置中设置 source(不执行移动)
fdc -s ~/Downloads

# 详细日志(可叠加)
fdc -v
fdc -vv

命令别名用途说明
fdc使用当前配置(或默认)运行整理可配合参数自定义运行
fdc init-config创建默认配置文件不覆盖已存在的文件,会提示
fdc config打印解析后的配置便于调试
fdc set-source <PATH>在配置中设置源目录仅更新配置文件
fdc set-target <PATH>在配置中设置目标根目录仅更新配置文件
fdc --help-h显示帮助
fdc --version-V显示版本号遵循 SemVer
参数别名类型默认含义示例
--dry-runboolfalse仅计划;打印将要执行的动作,不修改文件系统fdc --dry-run
--source <DIR>-s路径~/Downloads覆盖源目录fdc -s ~/Desktop
--target <DIR>-t路径~/Documents/Matrixs覆盖目标根目录fdc -t ~/Archive
--verbose-v计数0增加日志详细度(可叠加)fdc -vv
--help-h显示用法fdc -h
--version-V显示版本fdc -V

智能参数行为:当只提供 -s(未提供 -t, --dry-run-v)时,fdc 只会更新配置文件并不会执行文件操作。

目标命令
预览将要做的清理fdc --dry-run
将当前 Downloads 整理到归档fdc
使用自定义目标根目录fdc -t ~/Documents/Matrixs
从不同源执行整理fdc -s ~/Desktop
仅在配置中设置源fdc -s ~/Desktop
以命令形式设置源fdc set-source ~/Desktop
在配置中设置目标fdc set-target ~/Archive
打开详细日志fdc -vv
初始化(或重建)配置文件fdc init-config ; fdc config

首次运行时,fdc 会写入默认配置到:

  • macOS: ~/Library/Application Support/fine-directory-curator/config.toml
  • Linux: ~/.config/fine-directory-curator/config.toml

若想提前创建配置,建议使用 fdc init-config

source_dir = "~/Downloads"
target_dir = "~/Documents/Matrixs"

[sort_rule]
# 排序优先级,从左到右
order = ["year", "category"]

# 可选:将特定扩展映射到自定义分类
[extension_overrides]
# xmind = "mindmaps"
# heic  = "images"
  • 年份 放在首位,来源顺序为:
    1. 文件的 创建时间
    2. 若不可用则回退到 修改时间
    3. 若都不可用则使用 当前年份
  • 分类 放在第二位(见上文扩展名分类)。
  • 示例结构
    <target_dir>/
      2025/
        images/
        documents/
        videos/
        ...

fdc 将扩展名(忽略大小写)映射到如下桶(bucket):

  • images, pdfs, videos, audio, archives,
    documents, spreadsheets, presentations,
    code, design, mindmaps, executables,
    installers, fonts, others, directory

注意:目录不会被递归遍历;它们被视为单个项并移动到 directory/


  • 不覆盖策略:若目标路径已存在,fdc 会生成 name (1).ext, name (2).ext 等直到找到空位。
  • 浅层操作:仅处理 source_dir 的第一层条目。
  • 跨卷支持:跨文件系统移动采用 复制 + 删除 的方式。
  • 幂等性(近似):再次运行不会在已存在位置重复产生文件,因为使用了非覆盖命名规则。
  • 安全优先:新的设置建议先从 --dry-run 开始。

操作系统状态备注
macOS✅ 支持在 Apple Silicon 与 Intel 上已测试
Linux✅ 支持默认使用 XDG 配置路径
Windows🛤️ 规划中需处理路径语义与元数据

macOS 用户:若整理的目录在家目录以外,可能需要为 Terminal(或所用 shell)授予 完全磁盘访问


精简的开发流程,便于快速迭代并保持质量。

  • Rust 1.75+(使用 rustup
  • cargo fmtclippycargo test
# 格式化
cargo fmt

# 严格 lint
cargo clippy -- -D warnings

# 单元与集成测试
cargo test

# release 构建
cargo build --release
  • 使用 justfileMakefile 组织常用命令:
    build: ; cargo build --release
    check: ; cargo fmt --check && cargo clippy -- -D warnings && cargo test
    release: check build
  • 添加 pre-commit 钩子以保证提交质量:
    # .git/hooks/pre-commit
    cargo fmt -- --check &&
    cargo clippy -- -D warnings &&
    cargo test
  • 使用 cargo-release 来管理标签、变更日志与 cargo publish

问:什么都没有移动,为什么?
答:使用 -vv 查看 fdc 的决策过程。确保源目录在顶层含有可处理的条目;fdc 不会递归子目录。

问:为什么把“年份”放在优先?
答:时间在各种文件类型与工作流中通常是最普适的键,能让归档易于浏览。

问:可以自定义分类吗?
答:可以,在 config.toml 中使用 [extension_overrides]。未知扩展会被放到 others/

问:--dry-run 真的是非破坏性的吗?
答:是的。它只打印计划;不会对文件系统做写入操作。

问:如何处理重复项?
答:fdc 永远不会覆盖,而是选择 name (N).ext 的下一个可用名称。

问:fdc 会改变文件元数据吗?
答:移动通常会保留元数据;跨设备复制 + 删除 时可能因底层文件系统差异而有所不同。fdc 使用原始时间戳来判断归类,而不会强制改写时间戳。


  • ✅ 已实现 macOS 与 Linux 的功能对齐
  • ⏭️ 计划支持 Windows(路径、时间戳、替代数据流)
  • ⏭️ 可配置的命名模板(例如 YYYY/category vs category/YYYY
  • ⏭️ 忽略/包含模式(如 .fdcignore
  • ⏭️ 汇总报告输出(--report json|markdown
  • ⏭️ 将 dry-run 输出保存为文件 (--plan <path>) 的功能

有想法或意见?欢迎提交 issue 或 PR —— 我们一起把文件系统变得更有序。


MIT © 2025–至今, 逍遥自在轩

🗂️ 一个快速、优雅的 Rust 命令行工具,用于让 macOS 与 Linux 文件夹保持整洁(计划支持 Windows)。 它会按 年份类型 对源目录的一级项进行归类,避免覆盖冲突,保留顶层结构,并允许在进行任何破坏性更改前先 预览

TL;DR: cargo install fine-directory-curatorfdc --dry-run → 审阅 → fdc 无需折腾,不会重复覆盖,也不用再问“我的下载去哪儿了?”

MIT © 2025–至今, 逍遥自在轩


因为现实是:下载文件夹会被塞满、发生命名冲突、并且递归工具有风险。 fdc 故意有明确设计取向:

  • 浅且安全:仅处理源目录的第一层内容。目录作为整体移动,不会递归深入修改。
  • 年份优先:时间是“该文件放在哪儿”的最佳主键。
  • 不覆盖:如果冲突则生成 name (1).ext, name (2).ext 等,而不是覆盖已有文件。
  • 先预览:使用 --dry-run 可查看将要发生的改动。
  • 快速且跨平台:用 Rust 编写,在 macOS 与 Linux 上运行良好。

cargo install fine-directory-curator
# 可执行文件将安装在 PATH 中,名称为:
fdc

注意:包名为 fine-directory-curator,二进制可执行文件名为 fdc

# 在仓库根目录下
cargo build --release
# 二进制文件路径:
./target/release/fdc

# 查看帮助
fdc --help

# 使用默认(source: ~/Downloads, target: ~/Documents/Matrixs)
fdc

# 仅预览(不做任何修改)
fdc --dry-run

# 指定源与目标
fdc -s ~/Downloads -t ~/Documents/Matrixs

# 仅在配置中设置 source(不执行移动)
fdc -s ~/Downloads

# 详细日志(可叠加)
fdc -v
fdc -vv

命令别名用途说明
fdc使用当前配置(或默认)运行整理可配合参数自定义运行
fdc init-config创建默认配置文件不覆盖已存在的文件,会提示
fdc config打印解析后的配置便于调试
fdc set-source <PATH>在配置中设置源目录仅更新配置文件
fdc set-target <PATH>在配置中设置目标根目录仅更新配置文件
fdc --help-h显示帮助
fdc --version-V显示版本号遵循 SemVer
参数别名类型默认含义示例
--dry-runboolfalse仅计划;打印将要执行的动作,不修改文件系统fdc --dry-run
--source <DIR>-s路径~/Downloads覆盖源目录fdc -s ~/Desktop
--target <DIR>-t路径~/Documents/Matrixs覆盖目标根目录fdc -t ~/Archive
--verbose-v计数0增加日志详细度(可叠加)fdc -vv
--help-h显示用法fdc -h
--version-V显示版本fdc -V

智能参数行为:当只提供 -s(未提供 -t, --dry-run-v)时,fdc 只会更新配置文件并不会执行文件操作。

目标命令
预览将要做的清理fdc --dry-run
将当前 Downloads 整理到归档fdc
使用自定义目标根目录fdc -t ~/Documents/Matrixs
从不同源执行整理fdc -s ~/Desktop
仅在配置中设置源fdc -s ~/Desktop
以命令形式设置源fdc set-source ~/Desktop
在配置中设置目标fdc set-target ~/Archive
打开详细日志fdc -vv
初始化(或重建)配置文件fdc init-config ; fdc config

首次运行时,fdc 会写入默认配置到:

  • macOS: ~/Library/Application Support/fine-directory-curator/config.toml
  • Linux: ~/.config/fine-directory-curator/config.toml

若想提前创建配置,建议使用 fdc init-config

source_dir = "~/Downloads"
target_dir = "~/Documents/Matrixs"

[sort_rule]
# 排序优先级,从左到右
order = ["year", "category"]

# 可选:将特定扩展映射到自定义分类
[extension_overrides]
# xmind = "mindmaps"
# heic  = "images"
  • 年份 放在首位,来源顺序为:
    1. 文件的 创建时间
    2. 若不可用则回退到 修改时间
    3. 若都不可用则使用 当前年份
  • 分类 放在第二位(见上文扩展名分类)。
  • 示例结构
    <target_dir>/
      2025/
        images/
        documents/
        videos/
        ...

fdc 将扩展名(忽略大小写)映射到如下桶(bucket):

  • images, pdfs, videos, audio, archives,
    documents, spreadsheets, presentations,
    code, design, mindmaps, executables,
    installers, fonts, others, directory

注意:目录不会被递归遍历;它们被视为单个项并移动到 directory/


  • 不覆盖策略:若目标路径已存在,fdc 会生成 name (1).ext, name (2).ext 等直到找到空位。
  • 浅层操作:仅处理 source_dir 的第一层条目。
  • 跨卷支持:跨文件系统移动采用 复制 + 删除 的方式。
  • 幂等性(近似):再次运行不会在已存在位置重复产生文件,因为使用了非覆盖命名规则。
  • 安全优先:新的设置建议先从 --dry-run 开始。

操作系统状态备注
macOS✅ 支持在 Apple Silicon 与 Intel 上已测试
Linux✅ 支持默认使用 XDG 配置路径
Windows🛤️ 规划中需处理路径语义与元数据

macOS 用户:若整理的目录在家目录以外,可能需要为 Terminal(或所用 shell)授予 完全磁盘访问


精简的开发流程,便于快速迭代并保持质量。

  • Rust 1.75+(使用 rustup
  • cargo fmtclippycargo test
# 格式化
cargo fmt

# 严格 lint
cargo clippy -- -D warnings

# 单元与集成测试
cargo test

# release 构建
cargo build --release
  • 使用 justfileMakefile 组织常用命令:
    build: ; cargo build --release
    check: ; cargo fmt --check && cargo clippy -- -D warnings && cargo test
    release: check build
  • 添加 pre-commit 钩子以保证提交质量:
    # .git/hooks/pre-commit
    cargo fmt -- --check &&
    cargo clippy -- -D warnings &&
    cargo test
  • 使用 cargo-release 来管理标签、变更日志与 cargo publish

问:什么都没有移动,为什么?
答:使用 -vv 查看 fdc 的决策过程。确保源目录在顶层含有可处理的条目;fdc 不会递归子目录。

问:为什么把“年份”放在优先?
答:时间在各种文件类型与工作流中通常是最普适的键,能让归档易于浏览。

问:可以自定义分类吗?
答:可以,在 config.toml 中使用 [extension_overrides]。未知扩展会被放到 others/

问:--dry-run 真的是非破坏性的吗?
答:是的。它只打印计划;不会对文件系统做写入操作。

问:如何处理重复项?
答:fdc 永远不会覆盖,而是选择 name (N).ext 的下一个可用名称。

问:fdc 会改变文件元数据吗?
答:移动通常会保留元数据;跨设备复制 + 删除 时可能因底层文件系统差异而有所不同。fdc 使用原始时间戳来判断归类,而不会强制改写时间戳。


  • ✅ 已实现 macOS 与 Linux 的功能对齐
  • ⏭️ 计划支持 Windows(路径、时间戳、替代数据流)
  • ⏭️ 可配置的命名模板(例如 YYYY/category vs category/YYYY
  • ⏭️ 忽略/包含模式(如 .fdcignore
  • ⏭️ 汇总报告输出(--report json|markdown
  • ⏭️ 将 dry-run 输出保存为文件 (--plan <path>) 的功能

有想法或意见?欢迎提交 issue 或 PR —— 我们一起把文件系统变得更有序。


MIT © 2025–至今, 逍遥自在轩