#cli #shell #unix #in-memory

app unf

UNixize Filename -- replace annoying anti-unix characters in filenames

9 stable releases

2.1.4 Dec 11, 2021
2.1.3 Jun 21, 2021
2.1.2 Apr 9, 2021
2.1.1 Jan 21, 2021
0.1.1 Jun 13, 2019

#208 in Filesystem

Download history 1/week @ 2023-08-09 12/week @ 2023-08-16 22/week @ 2023-08-23 16/week @ 2023-09-06 2/week @ 2023-09-13 3/week @ 2023-09-20 2/week @ 2023-09-27 1/week @ 2023-10-04 1/week @ 2023-10-18 11/week @ 2023-10-25 17/week @ 2023-11-01 4/week @ 2023-11-08 17/week @ 2023-11-15 18/week @ 2023-11-22

58 downloads per month

MIT license

478 lines

crates.io tests cargo-audit Coverage Status


UNixize Filename -- replace annoying anti-unix characters in filenames


Certain characters in filenames are problematic for command-line users. For example, spaces and parentheses are treated specially by the shell. unf renames these files, so you no longer have to be annoyed when your Windows-using friend sends you an irritatingly-named zip file.


Using cargo

cargo install unf

This installs to ~/.cargo/bin, so make sure that's in your PATH.

Arch Linux

Install unf from the AUR.


unf [FLAGS] <PATH>...

<PATH>...: The paths of filenames to unixize

-r --recursive: Recursively unixize filenames in directories. If some of the specified paths are directories, unf will operate recursively on their contents

-f --force Do not interactively prompt to rename each file


$ unf πŸ€”πŸ˜€πŸ˜ƒπŸ˜„πŸ˜πŸ˜†πŸ˜…emojis.txt
rename 'πŸ€”πŸ˜€πŸ˜ƒπŸ˜„πŸ˜πŸ˜†πŸ˜…emojis.txt' -> 'thinking_grinning_smiley_smile_grin_laughing_sweat_smile_emojis.txt'? (y/N): y
$ unf -f 'Game (Not Pirated πŸ˜‰).rar'
rename 'Game (Not Pirated πŸ˜‰).rar' -> 'Game_Not_Pirated_wink.rar'


$ unf -rf My\ Files/ My\ Folder
rename 'My Files/Passwords :) .txt' -> 'My Files/Passwords.txt'
rename 'My Files/Another Cool Photo.JPG' -> 'My Files/Another_Cool_Photo.JPG'
rename 'My Files/Wow Cool Photo.JPG' -> 'My Files/Wow_Cool_Photo.JPG'
rename 'My Files/Cool Photo.JPG' -> 'My Files/Cool_Photo.JPG'
rename 'My Files/' -> 'My_Files'
rename 'My Folder' -> 'My_Folder'


$ unf -f -- --fake-flag.txt fake-flag.txt ------fake-flag.txt ' fake-flag.txt' $'\tfake-flag.txt'
rename '--fake-flag.txt' -> 'fake-flag_000.txt'
rename '------fake-flag.txt' -> 'fake-flag_001.txt'
rename ' fake-flag.txt' -> 'fake-flag_002.txt'
rename '	fake-flag.txt' -> 'fake-flag_003.txt'


Is this useful?

Hopefully for some people. There are certain situations in which I believe this tool is useful.

  • Downloading files uploaded by non-CLI users, especially large archives with poorly-named files
  • The (1) that gets appended to web browser download duplicates
  • Unix tools which take advantage of the loose Unix filename restrictions (like youtube-dl, which creates filenames from the video title)

How does this handle collisions?

Since unf is an automatic batch rename tool, there may be cases where the path to the unixized filename already exists. unf resolves this crisis by appending and incrementing a zero-padded number to the end of the file stem. An example of this is displayed here.

Why is the collision-resolving number zero-padded?

It has the nice property of being ordered when using tools that sort filenames by ASCII values, such as ls and shell completion.

Why not just use shell completion to access problematic filenames?

Shell completion can automatically insert backslash escapes, but this is sub-optimal. The backslash escapes make the filenames substantially less readable. However, shell completion is great for invoking unf.


~232K SLoC