cmd/filepull.py

62 lines
1.7 KiB
Python
Raw Normal View History

2019-06-12 05:41:31 +00:00
'''
Pull all of the files in nested directories into the current directory.
'''
import argparse
import os
import sys
from voussoirkit import interactive
from voussoirkit import pathclass
from voussoirkit import pipeable
2019-06-12 05:41:31 +00:00
from voussoirkit import spinal
def filepull(pull_from='.', autoyes=False):
start = pathclass.Path(pull_from)
files = [file for d in start.listdir_directories() for file in d.walk_files()]
2019-06-12 05:41:31 +00:00
if len(files) == 0:
pipeable.stderr('No files to move')
return 1
2019-06-12 05:41:31 +00:00
duplicate_count = {}
for f in files:
basename = f.basename
duplicate_count.setdefault(basename, [])
duplicate_count[basename].append(f.absolute_path)
2021-08-10 00:37:19 +00:00
duplicates = [
'\n'.join(sorted(copies))
for (basename, copies) in duplicate_count.items()
if len(copies) > 1
]
2019-06-12 05:41:31 +00:00
duplicates = sorted(duplicates)
if len(duplicates) > 0:
raise Exception('duplicate names:\n' + '\n'.join(duplicates))
for f in files:
pipeable.stdout(f.basename)
2019-06-12 05:41:31 +00:00
if autoyes or interactive.getpermission(f'Move {len(files)} files?'):
2019-06-12 05:41:31 +00:00
for f in files:
local = os.path.join('.', f.basename)
os.rename(f, local)
return 0
else:
return 1
2019-06-12 05:41:31 +00:00
def filepull_argparse(args):
return filepull(pull_from=args.pull_from, autoyes=args.autoyes)
2019-06-12 05:41:31 +00:00
def main(argv):
parser = argparse.ArgumentParser()
parser.add_argument('pull_from', nargs='?', default='.')
parser.add_argument('-y', '--yes', dest='autoyes', action='store_true')
parser.set_defaults(func=filepull_argparse)
args = parser.parse_args(argv)
return args.func(args)
2019-06-12 05:41:31 +00:00
if __name__ == '__main__':
raise SystemExit(main(sys.argv[1:]))