-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmei
executable file
·101 lines (89 loc) · 3.26 KB
/
mei
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
#!/usr/bin/env bash
# MIT License
#
# Copyright (c) 2024 John Karahalis
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in all
# copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.
# Use "strict mode."
#
# http://redsymbol.net/articles/unofficial-bash-strict-mode/
set -euo pipefail
COMMAND_NAME=$(basename "$0")
eval "$(docopts --help=- -A ARGS : "$@" <<EOF
Move Everything Into (MEI) a new directory with the given name.
That is, move all files and directories in the current directory into a new
directory with the given name.
To simplify the implementation and avoid some edge cases, a directory with the
given name must not already exist. Among other things, handling that would
require doing something to handle potential overwrites (e.g., "mei animals" when
the "animals" directory already exists and it contains a file with the same name
as a file in this directory).
Usage:
$COMMAND_NAME DIRECTORY
$COMMAND_NAME -h | --help
Examples:
$COMMAND_NAME /path/to/new/directory
Extended example:
$ tree --noreport
.
├── cat.png
├── dog.png
└── fish
├── goldfish.png
└── neon-tetra.png
$ $COMMAND_NAME animals
$ tree --noreport
.
└── animals
├── cat.png
├── dog.png
└── fish
├── goldfish.png
└── neon-tetra.png
$ $COMMAND_NAME life
$ tree --noreport
.
└── life
└── animals
├── cat.png
├── dog.png
└── fish
├── goldfish.png
└── neon-tetra.png
Options:
-h, --help
Show this documentation
EOF
)"
# Move hidden files (e.g., .gitignore) when using "mv".
shopt -s dotglob
# Move everything into a temporary directory first in case there is already a
# file or directory in the current directory with the given name.
#
# For example, this handles the case where there is a directory in the currknt
# directory named "matryoshka" and the user wants to move it into a new
# directory also named "matryoshka", so that the original directory is named
# "matryoshka/matryoshka".
#
# If this weren't a consideration, we could use this simpler approach:
# https://stackoverflow.com/a/789029/715866
TEMP_DIRECTORY=$(mktemp --directory)
mv ./* "$TEMP_DIRECTORY"
mkdir -p "${ARGS[DIRECTORY]}"
mv "$TEMP_DIRECTORY"/* "${ARGS[DIRECTORY]}"