bulk-mv is an interactive tool that does what the mv
command does, but for mulitiple files, with the ability to do more like adding and deleting files as well.
pip install bulk-mv
When you run bmv <path>
, a bulk-mv (bmv) file will open in a vim buffer, representing the file tree starting in the directory located at <path>
.
Then, you can make your modifications in the vim buffer, and run :wq
to perform the changes.
Suppose your directory file tree was this:
.
├── README.md
└── web
├── public
│ └── photos
│ └── logo.png
└── static
├── javascript
│ ├── auth.js
│ └── main.js
└── styles
└── main.css
Then running bmv <path>
will open up the following bmv file in a vim buffer:
[./] {
README.md
[web] {
[public] {
[photos] {
logo.png
}
}
[static] {
[styles] {
main.css
}
[javascript] {
auth.js
main.js
}
}
}
}
bulk-rename.mov
bulk-move.mov
Here's how to use the only four operators in BMV (+
, -
, >
, >>
) to add, delete, rename, and move files and/or directories.
You can add files or directories using the +
operator.
Here's how to use it to add new files and directories
[./] {
README.md
[web] {
[public] {
[photos] {
logo.png
}
}
+ [templates] {
+ [dashboard] {
dashboard.html
admin.html
}
index.html
about.html
}
[static] {
[styles] {
main.css
+ dashboard.css
}
[javascript] {
auth.js
main.js
}
}
}
}
Notice how you can add multiple nested directories. If you want to add a single file
you need to type + new_file.txt
in the directory block where you want it.
If you create a new directory with (also new) files inside of it, you don't need to use
the +
operator to add them. But for new nested directories, you do need to use the +
operator.
You can delete files or directories using the -
operator.
You can delete entire directories or files like this:
[./] {
README.md
[web] {
[public] {
[photos] {
logo.png
}
}
[static] {
- [styles] {
main.css
}
[javascript] {
- auth.js
main.js
}
}
}
}
Running this would delete the ./web/static/javascript/auth.js
file as well as the ./web/static/styles/
folder (and of course everything in it).
You can rename files or directories using the >
operator.
[./] {
README.md
[web] {
[public] {
[photos > images] {
logo.png
}
}
[static] {
[styles] {
main.css
}
[javascript] {
auth.js
main.js > script.js
}
}
}
}
Running this would rename the ./web/public/photos/
directory to ./web/public/images/
, and rename ./web/static/javascript/main.js
to ./web/static/javascript/script.js
You can move files or directories using the >>
operator. Moving files to paths with non-existent directories will not be created automatically.
[./] {
README.md >> ./web
[web] {
[public] {
[photos >> ./web/static] {
logo.png
}
}
[static] {
[styles] {
main.css
}
[javascript] {
auth.js
main.js
}
}
}
}
Running this would move ./README.md
to ./web/README.md
, and move ./web/public/photos/
to ./web/static/photos
.
You currently have to specify the full path to the directory you want to move the file/directory to starting from root path of the file tree (in this case, it's ./
).
Of course, you can mix and match these operations all in one go. Just note the order of operations to avoid making a mistake, like moving a file to a directory that you haven't created yet, for example.
Operations are given the following precedence:
- add
- delete
- rename (files first, then directories)
- move (files first, then directories)
So far, bulk-mv only works on files/directories with POSIX Portable filenames/dirnames.
In the future version, I want bulk-mv to support any type of support filenames on Mac OS, Linux, and Windows.