diff --git a/folderFlatten b/FolderFlat similarity index 92% rename from folderFlatten rename to FolderFlat index 406fef6..e5277b7 100755 --- a/folderFlatten +++ b/FolderFlat @@ -3,7 +3,7 @@ function help() { echo "Flatten the directory structure from the current folder downwards" echo "Files in subfolders will be renamed / -> _" echo "Empty folders are removed" - echo -- " add -f to force action " + echo " -f to force action " } function helpexit() { diff --git a/FolderSplit.py b/FolderSplit.py new file mode 100755 index 0000000..1e314df --- /dev/null +++ b/FolderSplit.py @@ -0,0 +1,162 @@ +#!/usr/bin/python + +import os,sys +import math,shutil,re + +VERSION="0.1" + +def setup_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: sequence, sparse, regexp") + 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" + return options + +def linktree(src, dst): + """Recursively link a directory tree using os.link. + Modified from shutil.copytree + """ + names = os.listdir(src) + os.makedirs(dst) + errors = [] + for name in names: + srcname = os.path.join(src, name) + dstname = os.path.join(dst, name) + try: + if os.path.isdir(srcname): + linktree(srcname, dstname) + else: + # Will raise a SpecialFileError for unsupported file types + os.link(srcname, dstname) + except Error, err: + errors.extend(err.args[0]) + except EnvironmentError, why: + errors.append((srcname, dstname, str(why))) + + if errors: + raise Error, errors + +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)) + return + 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)) + return + raise RuntimeError(source+' was neither file nor folder.') + +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 + +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)