diff --git a/files/FolderSplit.py b/files/FolderSplit.py index 44616ec..dbe810b 100755 --- a/files/FolderSplit.py +++ b/files/FolderSplit.py @@ -1,41 +1,79 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 -import os,sys -import math,shutil,re +import os, sys +import math, shutil, re from random import shuffle -VERSION="0.1" +VERSION = "0.1" + def setup_options(): - ''' Setup the command line options ''' + """ Setup the command line options """ from argparse import ArgumentParser - parser=ArgumentParser(description="Splits files to subfolders equally.") - - parser.add_argument("--order",'-o',type=str,action='store', dest='order',default="sequence", - help="Splitting method.", - choices=['sequence','sparse','regexp','random']) - parser.add_argument("-m",action='store_true', dest='move',default=False, - help="Move entries instead of hardlink.") - parser.add_argument("-f",action='store_true', dest='files',default=False, - help="Split files only, skipping folders") - parser.add_argument("-r",'--regexp',type=str,action='store', dest='regexp',default="", - help="Regular expression for splitting. When set, order regexp used, -n not used.") - parser.add_argument("-n",'-N',type=int,action='store', dest='n', - help="Number of subfolders to split into.") - parser.add_argument("path",type=str,action="store",default=".",nargs="?", - help="Folder to split.") - options=parser.parse_args() - if options.n==None and options.regexp=="": + parser = ArgumentParser(description="Splits files to subfolders equally.") + + parser.add_argument( + "--order", + "-o", + type=str, + action="store", + dest="order", + default="sequence", + help="Splitting method.", + choices=["sequence", "sparse", "regexp", "random"], + ) + parser.add_argument( + "-m", + action="store_true", + dest="move", + default=False, + help="Move entries instead of hardlink.", + ) + parser.add_argument( + "-f", + action="store_true", + dest="files", + default=False, + help="Split files only, skipping folders", + ) + parser.add_argument( + "-r", + "--regexp", + type=str, + action="store", + dest="regexp", + default="", + help="Regular expression for splitting. When set, order regexp used, -n not used.", + ) + parser.add_argument( + "-n", + "-N", + type=int, + action="store", + dest="n", + help="Number of subfolders to split into.", + ) + parser.add_argument( + "path", + type=str, + action="store", + default=".", + nargs="?", + help="Folder to split.", + ) + options = parser.parse_args() + if options.n == None and options.regexp == "": parser.print_help() parser.error("Either -n or -r must be passed") - if options.regexp!="": - options.order="regexp" + if options.regexp != "": + options.order = "regexp" return options + def linktree(src, dst): """Recursively link a directory tree using os.link. - Modified from shutil.copytree + Modified from shutil.copytree """ names = os.listdir(src) os.makedirs(dst) @@ -49,116 +87,124 @@ def linktree(src, dst): else: # Will raise a SpecialFileError for unsupported file types os.link(srcname, dstname) - except Error, err: + except Error as err: errors.extend(err.args[0]) - except EnvironmentError, why: + except EnvironmentError as why: errors.append((srcname, dstname, str(why))) if errors: - raise Error, errors + raise Error(errors) -def copyfileorfolder(basename,source,target,move): - ''' Copies a file or folder structure under target folder ''' + +def copyfileorfolder(basename, source, target, move): + """ Copies a file or folder structure under target folder """ if move: - shutil.move(os.path.join(source,basename),os.path.join(target,basename)) + shutil.move(os.path.join(source, basename), os.path.join(target, basename)) return - if os.path.isfile(os.path.join(source,basename)): - os.link(os.path.join(source,basename),os.path.join(target,basename)) + if os.path.isfile(os.path.join(source, basename)): + os.link(os.path.join(source, basename), os.path.join(target, basename)) return - if os.path.isdir(os.path.join(source,basename)): - linktree(os.path.join(source,basename),os.path.join(target,basename)) + if os.path.isdir(os.path.join(source, basename)): + linktree(os.path.join(source, basename), os.path.join(target, basename)) return - raise RuntimeError(source+' was neither file nor folder.') + raise RuntimeError(source + " was neither file nor folder.") -def portorder(inFiles,inFolder,outFolders,N,link): - ''' Copy files in port order (sparse) ''' - outidx=0 + +def portorder(inFiles, inFolder, outFolders, N, link): + """ Copy files in port order (sparse) """ + outidx = 0 for row in inFiles: - copyfileorfolder(row,inFolder,outFolders[outidx],link) - outidx+=1 - if outidx+1>N: - outidx=0 + copyfileorfolder(row, inFolder, outFolders[outidx], link) + outidx += 1 + if outidx + 1 > N: + outidx = 0 -def fileorder(inFiles,inFolder,outFolders,N,link): - ''' Copy files in input file order (sequnce) ''' - bins=[int(math.floor(float(len(inFiles))/float(N)))]*int(N) - binidx=0 - while sum(bins)