Skip to content

Instantly share code, notes, and snippets.

@RPGillespie6
Created July 12, 2020 00:47
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save RPGillespie6/6323d70cd8298fca5c62714e95a8037f to your computer and use it in GitHub Desktop.
Save RPGillespie6/6323d70cd8298fca5c62714e95a8037f to your computer and use it in GitHub Desktop.
Batch Rename Files
import os
import sys
alpha_enum = "abcdefghijklmnopqrstuvwxyz"
sorted_files = sorted(sys.argv[1:])
def printFiles(files, header="Files:"):
print(header)
for i, f in enumerate(files):
print(f"{i+1}) {os.path.basename(f)}")
print()
rename_order = []
file_order = list(sorted_files)
printFiles(file_order)
while True:
rename_order = input("Enter rename order (enter if ok): ")
if not rename_order:
break
rename_order = list(map(lambda x: int(x) - 1, rename_order.split()))
new_order = []
for i in rename_order:
new_order.append(file_order[i])
for index in sorted(rename_order, reverse=True):
del file_order[index]
file_order = list(new_order + file_order)
printFiles(file_order)
print("\nSample formats -")
print("Prefix: 'prefix_{name}.{ext}'")
print("Suffix: '{name}_suffix.{ext}'")
print("Enum: 'prefix A-{enum} {name}.{ext}'")
format_string = input("Enter format: ")
if not format_string:
input("Invalid format")
sys.exit(1)
enum_start = 0
enum_step = 0
enum_num = True
if "{enum}" in format_string:
enum_start = input("Enum start value (default: 1): ")
enum_step = input("Enum step (default: 1): ")
enum_step = 1 if not enum_step else int(enum_step)
if not enum_start:
enum_start = "1"
if enum_start.isalpha():
enum_num = False
if enum_start.isupper():
enum_start = ord(enum_start) - ord('A')
alpha_enum = alpha_enum.upper()
else:
enum_start = ord(enum_start) - ord('a')
else:
enum_start = int(enum_start)
renamed_files = []
enum_current = enum_start
for f in file_order:
path = os.path.split(f)
name, ext = os.path.splitext(path[-1])
enum_resolved = enum_current if enum_num else alpha_enum[enum_current]
new_name = format_string.format(name=name, ext=ext[1:], enum=enum_resolved)
enum_current += enum_step
if not enum_num:
enum_current %= len(alpha_enum)
renamed_files.append(os.path.join(path[0], new_name))
if len(renamed_files) != len(set(renamed_files)):
print("This operation will destroy files by giving multiple files the same name")
sys.exit(1)
printFiles(renamed_files, header="Renamed Files:")
input("Press enter to accept rename and exit")
for i,f in enumerate(renamed_files):
os.rename(file_order[i], renamed_files[i])
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment