Update move_all.py.

This commit is contained in:
voussoir 2020-12-09 07:17:48 -08:00
parent 4cf47d7d94
commit d3392ef3a8

View file

@ -2,29 +2,52 @@
Move all of the files into the destination directory, aborting the operation if
even a single file collides with a file in the destination.
'''
import sys
import argparse
import shutil
import sys
from voussoirkit import pathclass
from voussoirkit import pipeable
from voussoirkit import winglob
argv = sys.argv[1:]
def moveall_argparse(args):
files = (
pathclass.Path(file)
for pattern in pipeable.input(args.source)
for file in winglob.glob(pattern)
)
destination = pathclass.Path(args.destination)
if len(argv) < 2:
raise TypeError()
patterns = argv[:-1]
files = [file for pattern in patterns for file in winglob.glob(pattern)]
files = [pathclass.Path(file) for file in files]
destination = pathclass.Path(sys.argv[-1])
if not destination.is_dir:
raise TypeError(destination)
for file in files:
if destination.with_child(file.basename).exists:
raise Exception(file.basename)
pipeable.stderr('destination must be a directory.')
return 1
pairs = []
fail = False
for file in files:
new_path = destination.with_child(file.basename)
print(new_path.absolute_path)
if new_path.exists:
pipeable.stderr(f'{file.basename} cannot be moved.')
fail = True
continue
pairs.append((file, new_path))
if fail:
return 1
for (file, new_path) in pairs:
pipeable.output(new_path.absolute_path)
shutil.move(file.absolute_path, new_path.absolute_path)
def main(argv):
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument('source')
parser.add_argument('destination')
parser.set_defaults(func=moveall_argparse)
args = parser.parse_args(argv)
return args.func(args)
if __name__ == '__main__':
raise SystemExit(main(sys.argv[1:]))