#file-extension #mime #utilities #tool #command-line-tool #mimetype #script-file

bin+lib fif

用于检测和可选修复扩展名错误的文件命令行工具

27 个版本

0.7.2 2024 年 8 月 7 日
0.7.1 2024 年 1 月 22 日
0.7.0 2023 年 3 月 14 日
0.6.0 2022 年 9 月 4 日
0.2.10 2021 年 3 月 25 日

#494 in 命令行工具

Download history 1/week @ 2024-06-02 12/week @ 2024-07-07 17/week @ 2024-07-28 110/week @ 2024-08-04 12/week @ 2024-08-11

每月 139 次下载

GPL-3.0-or-later

135KB
1.5K SLoC

fif

A screenshot demonstrating fif's ability to detect the correct file extensions for a few files.

Version Minimum Supported Rust Version License Build status Unsafe forbidden Dependency versions REUSE status

用于检测和可选修复扩展名错误的文件命令行工具。

fif 递归扫描指定的目录,并输出一个 shell 脚本以修复任何具有错误扩展名的文件的名称。默认情况下,fif 将扫描指定目录中的所有非隐藏文件,并将忽略符号链接。

由于 fif 将输出打印到 stdout 而不是直接对文件进行操作,您可能希望将其输出重定向到文件,例如 fif ~/Documents > output.sh。您也可以直接将输出管道到您的 shell 中,例如 fif ~/Documents | bash,尽管这不建议这么做 - 在运行之前,您应该查看 fif 的输出并自行验证它不会做任何让您头疼的事情。

特性

  • ✅ 跨平台
  • ✅ 多线程
  • ✅ 可配置

构建

fif 可以使用 Cargo 构建、安装和测试,就像大多数 Rust 程序一样

git clone https://gitlab.com/Lynnesbian/fif/
cd fif
# run tests (optional)
cargo test --locked
# build fif with its default feature set
cargo build --locked --release

使用 --locked 标志可以确保 Cargo 使用 锁文件 中指定的依赖项版本,而使用 --release 标志可以启用发布优化来构建 fif -- 这需要更长的时间,但生成的二进制文件要快得多。

安装

# install the fif crate (to ~/.cargo/bin or %USERPROFILE%\.cargo\bin by default)
cargo install --locked fif

要更新,只需重新运行 install 命令,或者使用像 cargo-update 这样的工具,它可以更新通过 cargo install 安装的包。

在 macOS 上,fif 可以通过 MacPorts 安装

sudo port selfupdate
sudo port install fif

Cargo 功能

五进制支持使用 inferxdg-mime 作为其查找文件类型的后端。默认情况下,xdg-mime 将在 *nix 系统(Linux、macOS、*BSD 等)上使用,在其他所有系统上使用 infer。

xdg-mime 应该可以在安装了 Shared MIME Info 库的任何 *nix 系统上运行(请咨询您的软件包管理器),尽管我仅在 Linux 和 FreeBSD 上测试过。 infer 应该可以在任何系统上运行,但它支持的文件类型远少于 xdg-mime,这得益于出色的 Shared MIME Info 库。

您可以在编译时像这样覆盖您系统的默认后端

# xdg-mime
cargo install fif --locked --features=xdg-mime-backend
# infer
cargo install fif --locked --features=infer-backend

还可以通过不安装默认功能来获得更精简的构建

cargo install fif --locked --no-default-features

这将禁用一些非必要但很受欢迎的功能,例如多线程支持。

有关五进制的编译时功能的更多信息,请参阅 维基

用法

有关更多信息,请参阅 fif --help

基础知识

使用五进制的最简单方法是

fif ~/Downloads

此命令将扫描您 ~/Downloads 目录中的所有非隐藏文件。

可以使用 -e-E 标志分别指定要扫描的个别扩展名和扩展名集。

# only scan files with the extensions .jpeg, .jpg, .zip, and .docx
fif -e jpeg,jpg,zip,docx ~/Documents
# only scan files with "image extensions" - .jpg, .png, .gif, .webp...
fif -E images ~/Pictures
# scan .zip files, videos, and audio
fif -e zip -E videos,audio ~/Downloads

两者 -e-E 都有等效的 -- 标志,用于排除而不是包含指定的扩展名。

# scan everything except filenames ending in .zip
fif -x zip ~/Downloads
# scan all files with image extensions, but not .jpg and .jpeg files
fif -x jpg,jpeg -E images ~/Pictures
# scan everything except text and system files
fif -X text,system ~/.local/share

输出

默认情况下,五进制将输出一个 bash 脚本(在 Windows 上是 PowerShell 脚本),可以用来修复所有文件扩展名不正确的文件。

您可能希望将此脚本输出到文件(而不是输出到 stdout)。

fif ~/Documents > output.sh

您还可以手动指定要使用的输出格式。

fif -O powershell ~/Documents > output.ps1

--fix 标志

如果您更希望五进制自己修复重命名的文件,而不是依赖于 shell 脚本,可以使用 --fix 标志。

# rename any misnamed .jpg files in the user's pictures directory
fif ~/Pictures --fix -e jpg
# fix any misnamed files found in the user's downloads
fif ~/Downloads --fix

默认情况下,五进制将避免采取任何可能具有破坏性的操作(将文件重命名为已存在的名称)。此行为可以通过使用 --overwrite 标志来禁用,该标志将提示您覆盖现有文件。五进制还会在出错时提示您重试。

有关 --fix 标志的工作方式以及它与 --overwrite 标志和 --prompt 参数的关联的更多信息,请参阅 相应的维基页面

日志记录

默认情况下,五进制将在执行过程中记录任何信息、警告和错误。这可以通过 - 标志来更改。

# also log debug info
fif -v ~/Downloads
# ...and trace info
fif -vv ~/Downloads

您还可以使用 - 标志降低日志记录级别。

# don't show info
fif -q ~/Downloads
# ...or warnings
fif -qq ~/Downloads
# ...or even errors!
fif -qqq ~/Downloads

通过设置环境变量 FIF_LOGRUST_LOGofftracedebuginfowarnerror 来修改日志记录的详细程度。通过 FIF_LOG 设置的值会覆盖 RUST_LOG,两者都会覆盖 -- 标志。

例如

# show all levels except trace
FIF_LOG=debug fif ~/Downloads
# only show errors
FIF_LOG=error fif ~/Downloads

五个日志级别如下所示

级别 描述 示例
错误 导致 fif 停止运行的错误 fif 无法打开提供的目录
警告 不会导致 fif 停止运行的警告 fif 无法确定给定文件的 MIME 类型
信息 关于 fif 状态的信息 目录已成功扫描,无需重命名任何文件
调试 调试信息 - 通常对最终用户不重要 fif 将考虑的扩展名列表
跟踪 跟踪信息 - 通常对最终用户不重要 "发现 15 项待检查", "扫描成功",等等。

要详细了解所有 fif 参数及其用法,请运行 fif --help(或运行 fif -h 以获取更简洁的概述)。

版本策略

fif 遵循 语义版本控制 原则。当 fif 处于 0.x 版本时,版本号将按以下方式更新

  • 当我认为 fif 已经“功能完整”时,主版本号将增加到 1。
  • 当我在 fif 中添加一个相当重要的功能时,次要版本号将增加(在以前,这发生在添加排除扩展名的功能以及 fif 获得输出 bash 脚本而不是无效文件名列表的能力时)。次要版本号还将增加 MSRV。
  • 在所有其他情况下(包括次要功能添加)将增加修补版本,包括添加更多输出格式和“忽略未知扩展名”标志等功能。

如果 fif 达到 1.0 版本,这些规则可能将与现在相同。

代码风格

fif 使用 rustfmt 格式化,使用夜间工具链,具体命令为 cargo +nightly fmt。使用制表符进行缩进,假定制表符宽度为两个空格。行宽为 120 个字符。花括号放在同一行("OTBS" 格式),除了泛型参数中的 where 子句。

有关此项目使用的格式化规则更详细的信息,请参阅 rustfmt.toml 中配置的选项。

额外致谢

一些关于正确处理具有多个有效扩展名的文件(特别是在可移植可执行格式的情况下)的代码来自 Czkawka

许可证

版权所有 (C) 2021 Lynnesbian

本程序是自由软件:您可以自由分发和/或修改它,具体请参阅由自由软件基金会发布的 GNU 通用公共许可证的条款,许可证版本 3 或(根据您的选择)任何更高版本。

本程序分发时附带希望对您有用,但没有任何保证;甚至没有关于适销性或适用于特定目的的暗示性保证。有关详细信息,请参阅 GNU 通用公共许可证。

您应该已收到本程序的 GNU 通用公共许可证副本。如果没有,请参阅 https://www.gnu.org/licenses/

依赖关系

~7–17MB
~234K SLoC