edir is a command line utility to rename, remove, and copy
filenames and directories using your text editor. Run it in the current
directory and edir will open your editor on a list of files and
directories in that directory. Each item in the directory will appear on
its own numbered line. These numbers are how edir keeps track of what
items are changed. Delete lines to remove files/directories, edit lines
to rename files/directories, or duplicate line numbers to copy
files/directories. You can also switch pairs of numbers to swap files or
directories. If run from within a Git
repository, edir will use
Git to rename or remove
tracked files/directories. You can use a trash program
to remove files.
The latest version and documentation is available at https://github.com/bulletmark/edir.
edir unashamedly mimics the functionality of the
vidir utility from
moreutils but aims to improve it in the
following ways:
-
edirautomatically usesgit mvinstead ofmvandgit rminstead ofrmfor tracked files when invoked within a Git repository. There is also a-G/--no-gitoption to suppress this default action. See the description in the section below about git options. -
vidirpresents file and directories equivalently butediradds a trailing slash/to visually discriminate directories. E.g. ifafileandbfileare files,adirandbdirare directories, thenvidirpresents these in your editor as follows.1 ./a 2 ./b 3 ./c 4 ./dBut
edirpresents these as:1 ./a 2 ./b 3 ./c/ 4 ./d/Note the trailing slash is only for presentation in your editor. You are not required to ensure it is present after editing. E.g. editing line 3 above to
./e(or even just toe) would still rename the directoryctoe.Note also, that both
edirandvidirshow the leading./on each entry so that any leading spaces on the filename are clearly seen, and can be edited. -
ediradds the ability to copy files or directories one or more times when you duplicate a numbered line (after the original).vidirdoes not have copy functionality. -
edirallows you to remove a file/directory by deleting the line, asvidirdoes, but you can also remove it by pre-pending a#to "comment it out" or by substituting an entirely blank line. -
By default,
edirprints remove, rename, and copy messages whereasvidirprints messages only when the-v/--verboseswitch is added. You can add-q/--quiettoedirto suppress these messages. -
ediroutputs messages in color. Remove messages are red, rename messages are yellow, and copy messages are green. You can choose to disable colored output. -
When
vidiris run with the-v/--verboseswitch then it reports the renaming of original to intermediate temporary to final files if files are swapped etc. That is rather an implementation detail soedironly reports the original to final renames which is all the user really cares about. -
To remove a large recursive tree you must pipe the directory tree to
vidirand then explicitly remove all children files and directories before deleting a parent directory. You can do this also inedirof course (and arguably it is probably the safest approach) but there are times when you really want to letedirremove recursively soediradds a-r/--recurseswitch to allow this. BE CAREFUL USING THIS! -
vidiralways shows all files and directories in a directory, including hidden files and directories (i.e. those starting with a.). Usually a user does not want to be bothered with these soedirby default does not show them. They can be included by adding the-a/--allswitch. -
edirdoes not require the user to specify the-if something has been piped to standard input. E.g. you need only typefind | ediras opposed tofind | edir -. Note thatvidirrequires the second form. -
ediradds a-i/--interactiveoption to show pending changes and prompt the user before actioning them. You can also choose to re-edit the changes. -
ediradds a-F/--filesoption to only show files, or-D/--dirsto only show directories. -
ediradds a-L/--nolinksoption to ignore symbolic links. -
ediradds a-d/--depthoption to edit to the specified directory depth. The default is 1 soedir a(if a is a directory) will edit names toa/*,edir -d2 awill edit names toa/*/*, etc.edir -d0 awill just edit theaname directly. Can specify-d -1to edit to all depths (or use a large positive number). -
ediradds a-t/--trashoption to remove to your Trash. By default this option invokestrash-putfrom the trash-cli package to do deletions but you can specify any alternative trash program, see section below. -
ediradds-N/--sort-name, -M/--sort-time, -S/--sort-sizeoptions to sort the paths when listed in your editor. There is also a-E/--sort-reverseoption to reverse the order. -
ediradds-X/--group-dirs-firstand-Y/--group-dirs-lastoptions to display directories grouped together, either first or last. These can be combined with the above sorting options. -
edirshows a message "No files or directories" if there is nothing to edit, rather than opening an empty file asvidirdoes. -
edirfilters out any duplicate paths you may inadvertently specify on it's command line. -
ediralways invokes a consistent duplicate renaming scheme. E.g. if you renameb,c,dall to the same pre-existing nameathenedirwill renamebtoa~,ctoa~1,dtoa~2. Depending on order of operations,vidiris not always consistent about this, E.g. sometimes it creates aa~1with noa~(this may be a bug invidirthat nobody has ever bothered to report/address?). -
edircreates the temporary editing file with a.shsuffix so your EDITOR may syntax highlight the entries. Optionally, you can change this default suffix. -
edirprovides an optional environment value to add custom options to the invocation of your editor. See section below. -
edirprovides an optional configuration file to set defaultedircommand line options. See section below. -
Contrary to what it's name implies,
vidiractually respects your$EDITORvariable and runs your preferred editor likeedirdoes butedirhas been given a generic name to make this more apparent. If$EDITORis not set thenediruses a default editor appropriate to your system. -
vidirreturns status code 0 if all files successful, or 1 if any error.edirreturns 0 if all files successful, 1 if some had error, or 2 if all had error. -
vidirreturns an error when attempting to rename across different file systems, whichedirallows. -
ediralways ensures editor line numbers have the same width (e.g.1to6for 6 files, or01to12for 12 files, etc) so that file names always line up justified. This facilitates block editing of file names, e.g. using vim's visual block mode.vidirdoesn't do this so file names can be jagged wrt each other which makes block editing awkward. -
ediris very strict about the format of the lines you edit and immediately exits with an error message (before changing anything) if you format one of the lines incorrectly. All lines in the edited list:- Must start with a number and that number must be in range.
- Must have at least one white space/tab after the number,
- Must have a remaining valid path name.
- Can start with a
#or be completely blank to be considered the same as deleted.
Note the final edited order of lines does not matter, only the first number value is used to match the newly edited line to the original line so an easy way to swap two file names is just to swap their numbers.
-
ediralways actions files consistently. The sequence of operations applied is:-
Deleted files are removed and all renamed files and directories are renamed to temporaries. The temporaries are made on the same file-system as the target.
-
Empty deleted directories are removed.
-
Renamed temporary files and directories are renamed to their target name. Any required copies are created.
-
Remaining deleted directories are removed.
In simple terms, remember that files are processed before directories so you can rename files into a different directory and then delete the original directory, all in one edit. However in practice it is far less confusing and less risky if you perform complicated renames and moves in distinct steps.
-
When working within a Git repository, you nearly
always want to use git mv instead of mv and git rm instead of rm
for files and directories so edir recognises this and does it
automatically. Note that only tracked files/dirs are moved or renamed
using Git. Untracked files/dirs within the repository are removed or
renamed in the normal way.
If for some reason you don't want automatic git action then you can use
the -G/--no-git option temporarily, or set it a default option. See
the section below on how to set default
options. If you set --no-git as the
default, then you can use -g/-git on the command line to turn that
default option off temporarily and re-enable git functionality.
Given how easy edir facilitates deleting files, some users may prefer to
remove them to system Trash from where they can be later listed and/or
recovered. Specifying -t/--trash does this by executing the
trash-put command, from the
trash-cli package, to remove
files rather than removing them natively.
You may want to set -t/--trash as a default option. If you do so then
you can use -T on the command line to turn that default option off
temporarily.
You can specify an alternative trash program, e.g.
trash-d, or
gio trash, or
gtrash put,
by setting the --trash-program option. Most likely you
want to set this as a default option.
Many users would like to see a preview of changes after they finish
editing but before they are actioned by edir, i.e. to confirm exactly
which files/dirs will be deleted, renamed, or copied. Add the
-i/--interactive option and edir will present a list of changes and
prompt you to continue, or allow you to re-edit the path list etc.
Consider setting --interactive as a default
option so you are always prompted.
After a preview of pending changes is shown a prompt is presented for the user to enter a single key:
(P)roceed/(Y)es, (E)dit, (R)estart, (Q)uit[default]: [p|y|e|r|q]?
where:
| Option | Key | Action |
|---|---|---|
Proceed/Yes |
p or y |
Proceed with the path changes. |
Edit |
e |
Edit the path list again, as it is was last edited. |
Restart |
r |
Restart editing the path list again, as it originally began. |
Quit |
q |
Quit immediately without making any changes. This is the default if no key is entered. |
Python 3.8 or later is required. Arch Linux users can install edir
from the AUR and skip this
section.
Note edir is on PyPI so the easiest
way to install it is to use uv tool (or pipx or
pipxu).
$ uv tool install edirTo upgrade:
$ uv tool upgrade edirTo uninstall:
$ uv tool uninstall edirGit must be installed if you want to use the git
options. A trash program such as
trash-cli package is
required if you want -t/--trash functionality.
edir selects your editor from the first environment value found of:
$EDIR_EDITOR or $EDITOR, then guesses a fallback default editor
appropriate to your system if neither of these are set.
You can also set EDIR_EDITOR explicitly to an editor + arguments
string if you want edir to call your editor with specific arguments.
You can add default options to a personal configuration file
~/.config/edir-flags.conf. If that file exists then each line of
options will be concatenated and automatically prepended to your edir
command line arguments. Comments in the file (i.e. starting with a #)
are ignored. Type edir -h to see all supported
options.
The options --interactive, --all, --recurse, --quiet,
--no-git, --trash, --suffix, --no-color, --no-invert-color,
--group-dirs-first/last, --trash-program are sensible candidates to
consider setting as default. If you set these then "on-the-fly" negation
options -I, -A, -R, -Q, -g, -T, -Z are also provided to
temporarily override and disable default options on the command line.
Rename and/or remove any files and directories in the current directory:
$ edirRename and/or remove any jpeg files in current dir:
$ edir *.jpgRename and/or remove any files under current directory and subdirectories:
$ find | edir -FUse fd to view and git mv/rm
repository files only, in the current directory only:
$ fd -d1 -tf | edir -gType edir -h to view the usage summary:
usage: edir [-h] [-i] [-I] [-a] [-A] [-r] [-R] [-q] [-Q] [-G] [-g] [-t]
[-T] [--trash-program TRASH_PROGRAM] [-c] [-C] [-d DEPTH] [-F |
-D] [-L] [-N] [-M] [-S] [-E] [-X] [-Y] [-Z] [--suffix SUFFIX]
[-V]
[args ...]
Command line utility to rename, remove, or copy files and directories directly
from your editor. When run, you'll see a numbered list of files in your
editor. Delete a line to remove a file, modify a line to rename a file, or
duplicate a line to copy a file. Swap line numbers to swap file names. If
inside a git repository, git will be used for renames and removals.
positional arguments:
args file|dir, or "-" for stdin
options:
-h, --help show this help message and exit
-i, --interactive prompt with summary of changes and allow re-edit
before proceeding
-I, --no-interactive negate the -i/--interactive option
-a, --all include all (including hidden) files
-A, --no-all negate the -a/--all option
-r, --recurse recursively remove any files and directories in
removed directories
-R, --no-recurse negate the -r/--recurse option
-q, --quiet do not print successful rename/remove/copy actions
-Q, --no-quiet negate the -q/--quiet option
-G, --no-git do not use git if invoked within a git repository
-g, --git negate the --no-git option and DO use automatic git
-t, --trash use trash program to do deletions
-T, --no-trash negate the -t/--trash option
--trash-program TRASH_PROGRAM
trash program to use, default="trash-put"
-c, --no-color do not color rename/remove/copy messages
-C, --no-invert-color
do not invert the color to highlight error messages
-d, --depth DEPTH edit paths to specified depth, default=1
-F, --files only show/edit files
-D, --dirs only show/edit directories
-L, --nolinks ignore all symlinks
-N, --sort-name sort paths in file by name, alphabetically
-M, --sort-time sort paths in file by time, oldest first
-S, --sort-size sort paths in file by size, smallest first
-E, --sort-reverse sort paths (by name/time/size) in reverse
-X, --group-dirs-first
group directories first (including when sorted)
-Y, --group-dirs-last
group directories last (including when sorted)
-Z, --no-group-dirs negate the options to group directories
--suffix SUFFIX specify suffix for temp editor file, default=".sh"
-V, --version show edir version
Note you can set default starting options in $HOME/.config/edir-
flags.conf. The negation options (i.e. the --no-* options) allow you to
temporarily override your defaults.
You can use edir with sudo to rename, delete, or copy system files. For
improved security, edir runs the editing session as your regular user, not as
root - similar to how sudoedit works. This approach allows you to use
graphical editors (like VS Code), which should not be run as root. Use sudo -E
so that your preferred editor is selected via your $EDIR_EDITOR or $EDITOR
environment variable. For example, to rename or delete files in /etc using VS
Code:
$ export EDIR_EDITOR="code -w"
$ sudo -E edir /etcIn many ways edir (and even vidir) is better than the ranger
terminal file manager
bulkrename
command which does not handle name swaps and clashes etc. To add edir as a
command within ranger, add or create the following in
~/.config/ranger/commands.py. Then run it from within ranger by
typing :edir.
from ranger.api.commands import Command
class edir(Command):
'''
:edir [file|dir]
Run edir on the selected file or dir.
Default argument is current dir.
'''
def execute(self):
self.fm.run('edir -q ' + self.rest(1))
def tab(self, tabnum):
return self._tab_directory_content()If you use yazi for your file manager then you don't need any special
configuration. Just type :edir from within yazi.
Copyright (C) 2019 Mark Blakeney. This program is distributed under the terms of the GNU General Public License. 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 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 at https://opensource.org/license/gpl-3-0 for more details.