Crates.io | rnr |
lib.rs | rnr |
version | 0.4.2 |
source | src |
created_at | 2018-07-11 22:53:38.32918 |
updated_at | 2023-02-26 21:32:08.005269 |
description | RnR is a command-line tool to rename multiple files and directories that supports regular expressions |
homepage | https://github.com/ismaelgv/rnr |
repository | https://github.com/ismaelgv/rnr |
max_upload_size | |
id | 73841 |
size | 112,108 |
RnR is a command-line tool to securely rename multiple files and directories that supports regular expressions.
You can download binaries from latest release page, choose the compressed file corresponding to your platform. These compressed files contain the executable and other additional content such as completion files (Bash, Zsh, fish and PowerShell).
A package is available in the AUR
(rnr
) to install latest version of
RnR on Arch Linux.
You can use Homebrew package manager to install this tool in macOS or Linux systems.
brew install rnr
RnR is written in Rust. You can build it from source using Cargo.
git clone https://github.com/ismaelgv/rnr .
cargo install
cargo install rnr
USAGE:
rnr [FLAGS] [OPTIONS] <EXPRESSION> <REPLACEMENT> <PATH(S)>...
rnr [FLAGS] [OPTIONS] <SUBCOMMAND>
FLAGS:
-b, --backup Generate file backups before renaming
-n, --dry-run Only show what would be done (default mode)
--dump Force dumping operations into a file even in dry-run mode
-f, --force Make actual changes to files
-h, --help Prints help information
-x, --hidden Include hidden files and directories
-D, --include-dirs Rename matching directories
--no-dump Do not dump operations into a file
-r, --recursive Recursive mode
-s, --silent Do not print any information
-V, --version Prints version information
OPTIONS:
--color <color> Set color output mode [default: auto] [possible values: always, auto, never]
-d, --max-depth <LEVEL> Set max depth in recursive mode
-l, --replace-limit <LIMIT> Limit of replacements, all matches if set to 0 [default: 1]
ARGS:
<EXPRESSION> Expression to match (can be a regex)
<REPLACEMENT> Expression replacement
<PATH(S)>... Target paths
SUBCOMMANDS:
from-file Read operations from a dump file
help Prints this message or the help of the given subcommand(s)
to-ascii Replace all file name chars with ASCII chars. This operation is extremely lossy.
regex
crate. You can check regex syntax
here. It supports numbered and named capture
groups.from-file
subcommand.WINDOWS NOTE: In the examples that use *
, you need to expand the wildcard in PowerShell, for example: rnr a b (Get-Item ./*)
. This is not supported in cmd.exe
.
You can pass a list of files to be renamed as arguments:
rnr -f file renamed ./file-01.txt ./one/file-02.txt ./one/file-03.txt
Original tree
.
├── file-01.txt
├── file-02.txt
├── file-03.txt
└── one
├── file-01.txt
├── file-02.txt
└── file-03.txt
Renamed tree
.
├── renamed-01.txt
├── file-02.txt
├── file-03.txt
└── one
├── file-01.txt
├── renamed-02.txt
└── renamed-03.txt
Directories are ignored by default but you can also include them to be renamed using the option -D
.
rnr -f -D foo bar ./*
Original tree
.
├── foo
│ └── foo.txt
└── foo.txt
Renamed tree
.
├── bar
│ └── foo.txt
└── bar.txt
The replacement limit is set to 1 by default, but you can configure this limit to replace multiple non-overlapping matches. All matches will be replaced if this option is set to 0.
rnr -f -l 0 o u ./*
Original tree
.
├── foo.txt
├── foofoo.txt
├── foofoofoo.txt
└── foofoofoofoo.txt
Renamed tree
.
├── fuu.txt
├── fuufuu.txt
├── fuufuufuu.txt
└── fuufuufuufuu.txt
You can combine rnr
with other UNIX tools using pipes to pass arguments.
find . -type f +mtime 1 | xargs rnr -f file renamed
cat file_list.txt | xargs rnr -f file rename
file_list.txt
content:
file-01.txt
one/file-02.txt
one/file-03.txt
If recursive (-r
) option is passed, rnr
will look for al files in the path recursively without depth limit.
rnr -f -r file renamed ./
Original tree
.
├── file-01.txt
├── file-02.txt
├── file-03.txt
└── one
├── file-01.txt
├── file-02.txt
├── file-03.txt
└── two
├── file-01.txt
├── file-02.txt
├── file-03.txt
└── three
├── file-01.txt
├── file-02.txt
└── file-03.txt
Renamed tree
.
├── renamed-01.txt
├── renamed-02.txt
├── renamed-03.txt
└── one
├── renamed-01.txt
├── renamed-02.txt
├── renamed-03.txt
└── two
├── renamed-01.txt
├── renamed-02.txt
├── renamed-03.txt
└── three
├── renamed-01.txt
├── renamed-02.txt
└── renamed-03.txt
Similarly, you can set a maximum directory depth in combination with recursive operations.
rnr -f -r -d 2 file renamed ./
Original tree
.
├── file-01.txt
├── file-02.txt
├── file-03.txt
└── one
├── file-01.txt
├── file-02.txt
├── file-03.txt
└── two
├── file-01.txt
├── file-02.txt
├── file-03.txt
└── three
├── file-01.txt
├── file-02.txt
└── file-03.txt
Renamed tree
.
├── renamed-01.txt
├── renamed-02.txt
├── renamed-03.txt
└── one
├── renamed-01.txt
├── renamed-02.txt
├── renamed-03.txt
└── two
├── file-01.txt
├── file-02.txt
├── file-03.txt
└── three
├── file-01.txt
├── file-02.txt
└── file-03.txt
rnr
ignore hidden files by default to speed up the operations and avoid problems with some particular directories like .git/
or .local/
. You can include hidden files passing -x
option. Also, you can use include directories -D
option with -r
too.
rnr -f -r -D -x foo bar ./
Original tree
.
├── .foo_hidden_file.txt
├── foo.txt
├── foo
│ ├── foo.txt
│ └── foo
│ └── foo.txt
└── .foo_hidden_dir
└── foo.txt
Renamed tree
.
├── .bar_hidden_file.txt
├── bar.txt
├── bar
│ ├── bar.txt
│ └── bar
│ └── bar.txt
└── .bar_hidden_dir
└── bar.txt
When you perform a renaming operation, rnr
will create by default a dump file in the current directory you executed the command. This file can be used to easily revert the operations using from-file
and -u
option.
Rename operation
rnr -f foo bar ./*
Undo previous operation
rnr from-file -f -u rnr-[timestamp].json
If you want to redo the operation just pass the dump file without any additional argument:
rnr from-file -f rnr-[timestamp].json
rnr
can create backup files before renaming for any operation passing -b
option. The backup files names are ensured to be unique and won't be overwritten if another backup is created. If you are working with many large files, take into account that files will be duplicated.
rnr -f -b file renamed ./*
Original tree
.
├── file-01.txt
├── file-02.txt
└── file-03.txt
Renamed tree
.
├── file-01.txt.bk
├── file-02.txt.bk
├── file-03.txt.bk
├── renamed-01.txt
├── renamed-02.txt
└── renamed-03.txt
rnr
can convert UTF-8 file names to their ASCII representation. This feature uses
AnyAscii library to perform the
transliteration.
You can run:
rnr to-ascii ./*
Or:
rnr to-ascii -r .
Original tree
.
├── fïlé-01.txt
├── FïĹÊ-02.txt
└── file-03.txt
Renamed tree
.
├── file-01.txt
├── FILE-02.txt
└── file-03.txt
More info about regex used in the regex
package.
rnr -f '\..*$' '.txt' ./*
Original tree
.
├── file-01.ext1
├── file-02.ext2
└── file-03.ext3
Renamed tree
.
├── file-01.txt
├── file-02.txt
└── file-03.txt
rnr -f '\d' '1' ./*
Original tree
.
├── file-01.txt
├── file-02.txt
└── file-03.txt
Renamed tree
.
├── file-11.txt
├── file-12.txt
└── file-13.txt
name(1)-number(2).extension(3)
].rnr -f '(\w+)-(\d+).(\w+)' '${2}-${1}.${3}' ./*
Original tree
.
├── file-01.txt
├── file-02.txt
└── file-03.txt
Renamed tree
.
├── 01-file.txt
├── 02-file.txt
└── 03-file.txt
number
.ext
.rnr -f '(?P<number>\d{2})\.(?P<ext>\w{3})' '${ext}.${number}' ./*
Original tree
.
├── file-01.txt
├── file-02.txt
└── file-03.txt
Renamed tree
.
├── file-txt.01
├── file-txt.02
└── file-txt.03