This is a mirror of the GitLab repo! https://gitlab.com/Lynnesbian/fif
Find a file
Lynnesbian 97b0a6edaa
replace cached dep with custom hashmap thing
i benchmarked it with hyperfine and in terms of performance it's pretty much identical, with a slight (fraction of a percent) advantage to my implementation
2021-09-24 22:05:12 +10:00
.idea a minor multitude of meager modifications 2021-08-01 01:44:17 +10:00
doc slightly less crummy screenshot 2021-04-28 23:33:52 +10:00
src replace cached dep with custom hashmap thing 2021-09-24 22:05:12 +10:00
.drone.yml use Cargo.lock w/ CI 2021-04-26 21:01:35 +10:00
.gitignore an attempt at automated CI release builds that almost certainly won't work 2021-06-18 13:19:02 +10:00
.gitlab-ci.yml disabled cleanup-msrv for now 2021-09-23 03:06:44 +10:00
.kateproject add .kateproject file for project indexing 2021-07-21 21:16:32 +10:00
.mailmap consider lynne/lynnesbian to be the same author 2021-04-21 16:35:30 +10:00
build.rs include git commit SHA in --version output 2021-09-23 02:07:18 +10:00
Cargo.lock 🚗💨 ⬆️📅 2021-09-24 17:58:52 +10:00
Cargo.toml replace cached dep with custom hashmap thing 2021-09-24 22:05:12 +10:00
CHANGELOG.md replace cached dep with custom hashmap thing 2021-09-24 22:05:12 +10:00
clippy.sh split fif into lib and bin 2021-08-28 17:54:01 +10:00
clippy.toml semicolonic cleanse 2021-06-14 16:53:41 +10:00
Cross.toml release v0.3.3 🥳 2021-07-07 00:24:02 +10:00
LICENSE better error handling and pattern matching, added license 2021-02-05 15:57:21 +10:00
README.md document version policy 2021-08-25 15:25:22 +10:00
rustfmt.toml cargo fmt, rearranging use statements 2021-09-24 18:11:25 +10:00
test.py test.py hasn't been testing the json feature 0uo 2021-09-23 02:34:10 +10:00

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

A command-line tool for detecting and optionally correcting files with incorrect extensions.

fif recursively scans the given directory and outputs a shell script to fix the name of any files with incorrect extensions. By default, fif will scan all non-hidden files in the given directory, and will ignore symlinks.

As fif prints a shell script to stdout rather than acting on the files directly, you may wish to redirect its output to a file, e.g. fif ~/Documents > output.sh. You can also pipe the output directly into your shell, e.g. fif ~/Documents | bash, although this is not recommended - you should look over fif's output and verify for yourself that it won't do anything that will give you a headache before running it.

Features

  • Cross platform
  • Multi-threaded
  • Configurable

Building

fif can be built, installed, and tested with Cargo, as with most rust programs:

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

The --locked flag ensures that Cargo uses the dependency versions specified in the lock file, and the --release flag builds fif with release optimisations enabled -- this takes longer, but produces a much faster binary.

Installing

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

To update, simply re-run the install command, or use a tool like cargo-update , which can update crates installed via cargo install.

On macOS, fif can now be installed using MacPorts, via the following steps:

$ sudo port selfupdate
$ sudo port install fif

Cargo Features

fif supports using infer or xdg-mime as its backend for looking up file types. By default, xdg-mime will be used on *nix systems (Linux, macOS, *BSD, etc.), and infer on all other systems.

xdg-mime should work on any *nix system with the Shared MIME Info library installed (consult your package manager), although I've only tested it on Linux and FreeBSD. infer should work on any system.

You can override the default backend for your system at compile time like so:

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

It is also possible to get a more minimal build by installing without default features:

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

This will disable some non-essential but nice to have features, like multi-threading support.

For more info on fif's compile-time features, see the wiki.

Usage

See fif --help for more.

The basics

The simplest way to use fif looks like this:

fif ~/Downloads

This command will scan all non-hidden files in your ~/Downloads directory.

The -e and -E flags can be used to specify individual extensions and sets of extensions to scan, respectively:

# 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

Both -e and -E have equivalent -x and -X flags that exclude the given extensions rather than including them:

# 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

Output

By default, fif will output a bash script (or PowerShell script on Windows) that can be used to fix all the files it found with incorrect file extensions.

You might find it useful to output this script to a file (rather than to stdout):

fif ~/Documents > output.sh

You can also manually specify an output format to use:

fif -O powershell ~/Documents > output.ps1

Logging

By default, fif will log any info, warnings, and errors encountered during execution. This can be changed with the -v flag:

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

You can also reduce the level of logging with the -q flag:

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

The verbosity of the logging can also be modified by setting the environment variable FIF_LOG or RUST_LOG to off, trace, debug, info, warn, or error. Values set by FIF_LOG override RUST_LOG, and both override the -v and -q flags.

For example:

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

The five logging levels are used as follows:

Level Description Example
error Errors that cause fif to stop running fif was unable to open the provided directory
warn Warnings that don't cause fif to stop running fif was unable to determine the mime type of a given file
info Information pertaining to fif's status The provided directory was scanned without issue, and no files are in need of renaming
debug Debug information - usually not important to end users The list of extensions fif will consider
trace Trace info - usually not important to end users "Found 15 items to check", "Scan successful", etc.

For a more comprehensive explanation of all of fif's parameters and how to use them, run fif --help (or fif -h for a more concise overview).

Version policy

fif adheres to the semantic versioning principles. While fif remains at version 0.x, the version number will be updated as follows:

  • The MAJOR version will be bumped to 1 when I believe fif to be "feature complete".
  • The MINOR version will be bumped whenever I add a fairly important feature to fif (in the past, this has been bumped when adding the ability to exclude extensions, and when fif gained the ability to output a bash script rather than a list of invalid filenames). The MINOR version will also be bumped when increasing the MSRV.
  • The PATCH version will be bumped in all other cases, including minor feature additions (in the past, this has occurred when adding features such as more output formats and the ignore flag).

If/when fif hits version 1.0, these rules will likely remain the same as they are now.

License

Copyright (C) 2021 Lynnesbian

This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with this program. If not, see https://www.gnu.org/licenses/.