#!/usr/bin/python ''' WHAT: os independant multi RENAME utility USAGE: renamer.py [-r] path function ["old text" "new text" | 'quoted text' | 'target_dir'] WHERE: -r recursively walk thru directory tree path could be file or path function can be one of these: lowercase render all LeTtErS to lower case uppercase render all LeTtErS to UPPER CASE capitalize capitalize_first_letter alphanum rename to digits and leters only start_with add 'quoted text' to the start of the name end_with add 'qouted text' to the end of the name move create & move file to directory: for the file: "first part - second mart.ext" create dir "first part" move file to "first part" replace replace all occurenses of 'old' -> 'new' for example: replace "_" " " "mati_caspi_-_momo" -> "mati caspi - momo" allin1 put all files in one directory, 'target-dir' create 'target-dir' if not exist --------------------------------------------------------------- by shula. last update: 24/08/00, 29/08/00, 16/9/2000 12-9-2004 25-10-2004 todo: add rename wrapper for all other functions ''' import string, os, sys, re try: from shutil import copyfile except: pass # force global replace_old = '' replace_new = '' target_dir = '' def usage(error_msg): print __doc__ print error_msg sys.exit(1) def add_string_to_start_of_name( filename ): newfile = text + filename if filename != newfile: os.rename(filename, newfile) print filename + " ==> " + newfile def add_string_to_end_of_name( filename ): newfile = filename + text if filename != newfile: os.rename(filename, newfile) print filename + " ==> " + newfile def capitalize_first_letter( filename ): print "not implemented" # i = 0 # for filename in files: # rest = string.lower(filename) # first_letter = string.upper(filename[0]) # files[i] = lowername # os.rename(dir + os.sep + filename, dir + os.sep + lowername) # i = i + 1 def put_all_files_in_1_dir( filename ): if not os.path.isfile(filename): print "skipping dir: "+filename return target = target_dir + os.sep + os.path.basename(filename) print "%s, %s" %(filename, target) if os.name in ['nt']: copyfile(filename, target) else: print "unix version incomplete! not copied" def replace( filename ): newfile = string.replace(filename, replace_old, replace_new) if filename != newfile: os.rename(filename, newfile) print filename + " ==> " + newfile def alphanumeric( filename ): alphanum = string.digits + string.letters + ".-_[]~!#$^&()" newfile="" for c in filename: if c in alphanum: newfile = newfile + c if filename != newfile: os.rename(filename, newfile) print filename + " ==> " + newfile def move_to_dir( filename ): newdir = re.compile("^(.*?) - ").findall(filename)[0] try: os.mkdir(path + newdir) except: pass if filename != newfile: os.rename(filename, newfile) print filename + " ==> " + newdir+os.sep + newfile def walker ( args, dir, files): for filename in files: path = dir function(filename) def ren_to_lowercase(filename): newfile = string.lower(filename) os.rename(filename, newfile) print filename + " ==> " + newfile def ren_to_uppercase(filename): newfile = string.upper(filename) os.rename(filename, newfile) print filename + " ==> " + newfile def debug(a, path, files): print path def caller(x, dirname, files): global function for file in files: fullname = dirname + os.sep + file try: function( fullname ) except: print "error in file: %s" % fullname #function( fullname ) # ------------------------ int main ------------------------ if len(sys.argv) < 3: usage('not enough arguments passed.') text = '' recursive = 0 if string.lower(sys.argv[1]) == '-r': recursive = 1 sys.argv.remove('-r') func = string.lower(sys.argv[2])[:3] path = sys.argv[1] if func == "low": function = ren_to_lowercase if func == "upp": function = ren_to_uppercase elif func == "cap": function = capitalize_first_letter elif func == "mov": function = move_to_dir elif func == "alp": function = alphanumeric elif func == "sta": function = add_string_to_start_of_name text = sys.argv[3] elif func == "end": function = add_string_to_end_of_name text = sys.argv[3] elif func == "rep": function = replace replace_old = sys.argv[3] replace_new = sys.argv[4] elif func == 'all': function = put_all_files_in_1_dir try: target_dir = sys.argv[3] except: usage("not enough args") sys.exit(1) try: os.makedirs(target_dir) except: print "can't create target directory %s" % target_dir #if os.path.isfile(path): # function(path) # sys.exit(0) # ---------------- main ----------------- if recursive: os.path.walk(path, caller, None) else: files = os.listdir(path) caller(0, path, files)