DEFLNG a-z 'bulkren - renames files in a directory in various ways 'utility by shannon larratt - glider@bmezine.com 'windows xp build; should work under most flavours %maxfiles = 5000 DECLARE FUNCTION randomset$(valid$, randlen) 'return a string of random characters, drawn from the provided set DECLARE FUNCTION inanycase$(inputnum, valid$, padlen) 'number renderer for any case! FUNCTION PBMAIN() RANDOMIZE TIMER STDOUT "Bulk renamer" STDOUT STDOUT "What files would you like to work on (ie. *.mp3, *.jpg) --> "; STDIN LINE filemask$ IF filemask$ = "" THEN filemask$ = "*.*" END IF DIM filelist$(%maxfiles) numfiles = 0 x$ = DIR$(filemask$) DO UNTIL x$ = "" INCR numfiles filelist$(numfiles) = x$ IF numfiles = %maxfiles THEN STDOUT "WARNING: " & FORMAT$(%maxfiles, ",") & " files reached; there may be more" EXIT DO END IF x$ = DIR$ LOOP STDOUT "Found " & FORMAT$(numfiles, ",") & " file(s) matching " & filemask$ IF numfiles = 0 THEN STDOUT "ERROR: No files found; can not proceed" STDOUT EXIT FUNCTION END IF STDOUT STDOUT "Please select your renaming method:" STDOUT " 1. randomized" STDOUT " 2. sequential" STDOUT " abort" method$ = "" DO method$ = WAITKEY$ IF method$ = CHR$(27) THEN STDOUT "ERROR: Aborted" STDOUT EXIT FUNCTION END IF LOOP UNTIL method$ = "1" OR method$ = "2" DIM newname$(numfiles) IF method$ = "1" THEN 'randomized STDOUT STDOUT "Randomized sorting selected" STDOUT "Please select the characters we can use in the naming:" STDOUT " 1. 0123456789 (ie. numeric) STDOUT " 2. abcdefghijklmnopqrstuvwxyz (ie. alpha) STDOUT " 3. 0-9,a-z (ie. alphanumeric) STDOUT " 4. custom" valid$ = "" DO valid$ = WAITKEY$ IF valid$ = CHR$(27) THEN STDOUT "ERROR: Aborted" STDOUT EXIT FUNCTION END IF LOOP UNTIL INSTR("1234", valid$) > 0 SELECT CASE valid$ CASE "1" STDOUT "Files will be given a numeric name" valid$ = "0123456789" CASE "2" STDOUT "Files will be given an alpha name" valid$ = "abcdefghijklmnopqrstuvwxyz" CASE "3" STDOUT "Files will be given an alphanumeric name" valid$ = "abcdefghijklmnopqrstuvwxyz0123456789" CASE "4" STDOUT STDOUT "Please enter all charcters allowed: "; STDIN LINE valid$ IF LEN(valid$) < 2 THEN STDOUT "ERROR: Not enough characters entered to generate unique filenames" STDOUT EXIT FUNCTION END IF END SELECT IF valid$ = "1" OR valid$ = "2" THEN STDOUT STDOUT "Uppercase (1) or Lowercase (2)?" DO temp$ = WAITKEY$ IF temp$ = CHR$(27) THEN STDOUT "ERROR: Aborted" STDOUT EXIT FUNCTION END IF LOOP UNTIL INSTR("12", temp$) > 0 IF temp$ = "1" THEN valid$ = UCASE$(valid$) END IF STDOUT STDOUT "How many characters long should the filenames be? (4-8 recommended)" randlen = 0 DO temp$ = WAITKEY$ IF temp$ = CHR$(27) THEN STDOUT "ERROR: Aborted" STDOUT EXIT FUNCTION END IF randlen = VAL(temp$) LOOP UNTIL randlen > 1 howmany = LEN(valid$) ^ randlen IF howmany < numfiles THEN STDOUT "ERROR: Not enough unique combos (" & FORMAT$(howmany, ",") & ") to build file list (" & FORMAT$(numfiles, ",") & ")" STDOUT EXIT FUNCTION END IF STDOUT STDOUT "If you want a prefix, enter it now --> "; STDIN LINE prefix$ IF prefix$ = "" THEN STDOUT "No prefix will be used" END IF FOR r = 1 TO numfiles numdots = PARSECOUNT(filelist$(r), ".") IF numdots < 2 THEN thisfileext$ = "" ELSE lastdot = INSTR(-1, filelist$(r), ".") thisfileext$ = MID$(filelist$(r), lastdot + 1) END IF DO potfile$ = prefix$ & randomset$(valid$, randlen) & "." & thisfileext$ FOR t = 1 TO r - 1 'conflicts? IF filelist$(t) = potfile$ THEN potfile$ = "" EXIT FOR END IF NEXT IF potfile$ <> "" THEN EXIT DO LOOP newname$(r) = potfile$ NEXT r ELSE 'sequential STDOUT STDOUT "Sequential naming selected" STDOUT "Choose a numbering style (base): STDOUT "1. 01 (binary)" STDOUT "2. 01234567 (octal)" STDOUT "3. 0123456789 (decimal)" STDOUT "4. 0123456789ABCDEF (hex)" STDOUT "5. ABCDEFGHIJKLMNOPQRSTUVWXYZ (alpha; base-26)" STDOUT "6. custom" valid$ = "" DO valid$ = WAITKEY$ IF valid$ = CHR$(27) THEN STDOUT "ERROR: Aborted" STDOUT EXIT FUNCTION END IF LOOP UNTIL INSTR("123456", valid$) > 0 SELECT CASE valid$ CASE "1" STDOUT "Binary numbering chosen" valid$ = "01" CASE "2" STDOUT "Octal numbering chosen" valid$ = "01234567" CASE "3" STDOUT "Decimal numbering chosen" valid$ = "0123456789" CASE "4" STDOUT "Hex numbering chosen" valid$ = "0123456789ABCDEF" CASE "5" STDOUT "Alpha numbering chosen" valid$ = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" CASE "6" STDOUT STDOUT "Please enter all characters in this base, in order (ie. 01234 for base 5)" STDOUT "--> "; STDIN LINE valid$ IF LEN(valid$) < 2 THEN STDOUT "ERROR: Anything below base 2 is stupid." STDOUT EXIT FUNCTION END IF END SELECT STDOUT STDOUT "Would you like to sort the file list first?" STDOUT "1. No / use system (" & filelist$(1) & " - " & filelist$(numfiles\2) & " - " & filelist$(numfiles) & ")" STDOUT "2. A-Z (ie. ascending order, case insensitive)" STDOUT "3. A-Z,a-z (ie. ascending order, case sensitive)" STDOUT "4. Z-A (ie. descending order, case insensitive)" STDOUT "5. z-a,Z-A (ie. descending order, case sensitive)" temp$ = "" DO temp$ = WAITKEY$ IF temp$ = CHR$(27) THEN STDOUT "ERROR: Aborted" STDOUT EXIT FUNCTION END IF LOOP UNTIL INSTR("12345", temp$) > 0 SELECT CASE VAL(temp$) CASE 1 STDOUT "No additional sorting performed" CASE 2 ARRAY SORT filelist$() FOR numfiles, COLLATE UCASE STDOUT "Sorted into ascending order, case insensitive:" STDOUT " (" & filelist$(1) & " - " & filelist$(numfiles\2) & " - " & filelist$(numfiles) & ")" CASE 3 ARRAY SORT filelist$() FOR numfiles STDOUT "Sorted into ascending order, case sensitive:" STDOUT " (" & filelist$(1) & " - " & filelist$(numfiles\2) & " - " & filelist$(numfiles) & ")" CASE 4 ARRAY SORT filelist$() FOR numfiles, COLLATE UCASE, DESCEND STDOUT "Sorted into descending order, case insensitive:" STDOUT " (" & filelist$(1) & " - " & filelist$(numfiles\2) & " - " & filelist$(numfiles) & ")" CASE 5 ARRAY SORT filelist$() FOR numfiles, DESCEND STDOUT "Sorted into descending order, case sensitive:" STDOUT " (" & filelist$(1) & " - " & filelist$(numfiles\2) & " - " & filelist$(numfiles) & ")" END SELECT STDOUT STDOUT "If you want a prefix, enter it now --> "; STDIN LINE prefix$ IF prefix$ = "" THEN STDOUT "No prefix will be used" END IF STDOUT STDOUT "Decimal starting number [default is 1] --> "; STDIN LINE startnum$ IF startnum$ = "0" THEN counterstart = 0 ELSE counterstart = VAL(startnum$) IF counterstart = 0 THEN counterstart = 1 END IF STDOUT "Beginning counter at " & FORMAT$(counterstart, ",") STDOUT STDOUT "How many digits would you like to pad to (ie. 0002 instead of 2) --> "; STDIN LINE temp$ padlen = VAL(temp$) IF padlen = 0 THEN padlen = 1 STDOUT "Files will number from " & inanycase$(counterstart, valid$, padlen) & " to " & inanycase$(counterstart + numfiles - 1, valid$, padlen) FOR r = 1 TO numfiles numdots = PARSECOUNT(filelist$(r), ".") IF numdots < 2 THEN thisfileext$ = "" ELSE lastdot = INSTR(-1, filelist$(r), ".") thisfileext$ = MID$(filelist$(r), lastdot + 1) END IF newname$(r) = prefix$ & inanycase$(counterstart + r - 1, valid$, padlen) & "." & thisfileext$ NEXT END IF OPEN "bulkren1.bat" FOR OUTPUT AS #1 OPEN "bulkren2.bat" FOR OUTPUT AS #2 FOR r = 1 TO numfiles PRINT #1, "ren """ & filelist$(r) & """ """ & newname$(r) & """" PRINT #2, "ren """ & newname$(r) & """ """ & filelist$(r) & """" NEXT CLOSE STDOUT STDOUT "Success! All done!" STDOUT "bulkren1.bat will rename your files" STDOUT "bulkren2.bat will name them back (if you need to)" STDOUT END FUNCTION FUNCTION randomset$(valid$, randlen) 'return a string of random characters, drawn from the provided set temp$ = "" lenvalid = LEN(valid$) FOR r = 1 TO randlen temp$ = temp$ & MID$(valid$, INT(RND*lenvalid)+1, 1) NEXT FUNCTION = temp$ END FUNCTION FUNCTION inanycase$(inputnum, valid$, padlen) 'number renderer for any case! temp$ = "" thisbase = LEN(valid$) startnum = inputnum DO UNTIL startnum = 0 thisdigit = startnum MOD thisbase temp$ = MID$(valid$, thisdigit + 1, 1) & temp$ startnum = startnum \ thisbase LOOP IF LEN(temp$) < padlen THEN temp$ = STRING$(padlen - LEN(temp$), MID$(valid$, 1, 1)) & temp$ END IF inanycase$ = temp$ END FUNCTION