Ethan Dalool
4a9051e617
With pathclass.glob_many, we can clean up and feel more confident about many programs that use pipeable to take glob patterns. Added return 0 to all programs that didn't have it, so we have consistent and explicit command line return values. Other linting and whitespace.
58 lines
1.6 KiB
Python
58 lines
1.6 KiB
Python
'''
|
|
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 spinal
|
|
|
|
def filepull(pull_from='.', autoyes=False):
|
|
files = list(spinal.walk(pull_from))
|
|
cwd = os.getcwd()
|
|
files = [f for f in files if os.path.split(f.absolute_path)[0] != cwd]
|
|
|
|
if len(files) == 0:
|
|
print('No files to move')
|
|
return
|
|
|
|
duplicate_count = {}
|
|
for f in files:
|
|
basename = f.basename
|
|
duplicate_count.setdefault(basename, [])
|
|
duplicate_count[basename].append(f.absolute_path)
|
|
|
|
duplicates = [
|
|
'\n'.join(sorted(copies))
|
|
for (basename, copies) in duplicate_count.items()
|
|
if len(copies) > 1
|
|
]
|
|
duplicates = sorted(duplicates)
|
|
if len(duplicates) > 0:
|
|
raise Exception('duplicate names:\n' + '\n'.join(duplicates))
|
|
|
|
for f in files:
|
|
print(f.basename)
|
|
|
|
if autoyes or interactive.getpermission(f'Move {len(files)} files?'):
|
|
for f in files:
|
|
local = os.path.join('.', f.basename)
|
|
os.rename(f.absolute_path, local)
|
|
|
|
def filepull_argparse(args):
|
|
filepull(pull_from=args.pull_from, autoyes=args.autoyes)
|
|
return 0
|
|
|
|
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)
|
|
|
|
if __name__ == '__main__':
|
|
raise SystemExit(main(sys.argv[1:]))
|